【问题标题】:scrapy callback to crawl paginated pages抓取分页页面的scrapy回调
【发布时间】:2014-03-05 15:48:54
【问题描述】:

我写了一个蜘蛛来抓取一个网站。 我能够生成所有页面网址(分页)。 我需要帮助来抓取所有这些页面,然后打印响应。

url_string="http://website.com/ct-50658/page-"

class SpiderName(Spider):
    name="website"
    allowed_domains=["website.com"]
    start_urls=["http://website.com/page-2"]

def printer(self, response):
    hxs=HtmlXPathSelector(response)
    x=hxs.select("//span/a/@title").extract()
    with open('website.csv', 'wb') as csvfile:
        spamwriter = csv.writer(csvfile, delimiter=' ',quotechar='|', quoting=csv.QUOTE_MINIMAL)
        for i in x:
            spamwriter.writerow(i)


def parse(self,response):
    hxs=HtmlXPathSelector(response)
    #sel=Selector(response)
    pages=hxs.select("//div[@id='srchpagination']/a/@href").extract()
    total_pages=int(pages[-2][-2:])
    j=0
    url_list=[]
    while (j<total_pages):
        j=j+1
        urls=url_string+str(j)  
        url_list.append(urls)
    for one_url in url_list:
        request= Request(one_url, callback=self.printer)
    return request

【问题讨论】:

  • 您正在为每个 one_url 响应重新创建“website.csv”文件。您应该创建一次(例如在 __init__ 中)并将 CSV Writer 引用保存在您的蜘蛛属性中,在 def printer 中引用类似 self.csvwriter 的内容。此外,在for one_url in url_list: 中,您应该使用yield Request(one_url, callback=self.printer)。在这里,您只返回最后一个请求
  • 你能详细解释一下吗

标签: pagination scrapy


【解决方案1】:

您正在为每个 one_url 请求的响应重新创建“website.csv”文件。您可能应该创建一次(例如在 __init__ 中)并将 CSV Writer 引用保存在您的蜘蛛的属性中,在 def 打印机中引用 self.csvwriter 之类的东西。

另外,在for one_url in url_list:loop 中,您应该使用yield Request(one_url, callback=self.printer)。在这里,您只返回最后一个请求

这是一个包含这些修改和一些代码简化的示例蜘蛛:

class SpiderName(Spider):
    name="website"
    allowed_domains=["website.com"]
    start_urls=["http://website.com/page-2"]

    def __init__(self, category=None, *args, **kwargs):
        super(SpiderName, self).__init__(*args, **kwargs)
        self.spamwriter = csv.writer(open('website.csv', 'wb'),
                                     delimiter=' ',
                                     quotechar='|',
                                     quoting=csv.QUOTE_MINIMAL)

    def printer(self, response):
        hxs = HtmlXPathSelector(response)
        for i in hxs.select("//span/a/@title").extract():
            self.spamwriter.writerow(i)

    def parse(self,response):
        hxs=HtmlXPathSelector(response)
        #sel=Selector(response)
        pages = hxs.select("//div[@id='srchpagination']/a/@href").extract()
        total_pages = int(pages[-2][-2:])
        while j in range(0, total_pages):
            yield Request(url_string+str(j), callback=self.printer)

【讨论】:

  • 非常感谢保罗。为我工作。这正是我被困的地方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多