垃圾递归爬虫问题

2024-10-01 05:06:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在爬viagogo.com网站 我想从页面抓取每个节目: http://www.viagogo.com/Concert-Tickets/Rock-and-Pop 我可以得到显示在第一页,但当我试图移动下一页,它只是不爬行! 这是我的代码:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from viagogo.items import ViagogoItem
from scrapy.http import Request, FormRequest

class viagogoSpider(CrawlSpider):
    name="viagogo"
    allowed_domains=['viagogo.com']
    start_urls = ["http://www.viagogo.com/Concert-Tickets/Rock-and-Pop"]

    rules = (
        # Running on pages
        Rule(SgmlLinkExtractor(restrict_xpaths=('//*[@id="clientgridtable"]/div[2]/div[2]/div/ul/li[7]/a')), callback='Parse_Page', follow=True),

        # Running on artists in title
        Rule(SgmlLinkExtractor(restrict_xpaths=('//*[@id="clientgridtable"]/table/tbody')), callback='Parse_artists_Tickets', follow=True),

    )

     #all_list = response.xpath('//a[@class="t xs"]').extract()

    def Parse_Page(self, response):
        item = ViagogoItem()
        item["title"] = response.xpath('//title/text()').extract()
        item["link"] = response.url
        print 'Page!' + response.url
        yield Request(url=response.url, meta={'item': item}, callback=self.Parse_Page)


    def Parse_artists_Tickets(self, response):
        item = ViagogoItem()
        item["title"] = response.xpath('//title/text()').extract()
        item["link"] = response.url
        print response.url
        with open('viagogo_output', 'a') as f:
            f.write(str(item["title"]) + '\n')
        return item

我不明白我做错了什么,但输出(在文件内)只是第一页显示。。在

谢谢!在


Tags: fromimportcomhttpurltitleparseresponse
1条回答
网友
1楼 · 发布于 2024-10-01 05:06:28

这个:

yield Request(url=response.url, ...)

要求Scrapy再次爬网之前爬过的同一页,而不是真正前进到下一页。Scrapy默认启用了一个dupefilter,它可以避免发出重复的请求,这可能就是为什么第二个请求没有发生,第二个回调永远不会被调用。在

如果要继续解析同一响应中的更多项,可以直接调用第二个回调来传递响应。在

^{pr2}$

如果你想转到另一个页面,你必须向一个以前看不到的URL发出请求。在

相关问题 更多 >