Scrapy Start_request解析

时间:2015-02-28 15:33:47

标签: python python-2.7 web-scraping scrapy scrapy-spider

我正在编写一个scrapy脚本来搜索和搜索网站的结果。我需要从网站搜索项目并从搜索结果中解析每个网址。我从Scrapy' start_requests开始,我将传递搜索查询并重定向到另一个函数parse,该函数将从搜索结果中检索网址。最后我调用另一个函数 parse_item 来解析结果。我能够提取所有搜索结果网址,但我无法解析结果(parse_item无法正常工作)。这是代码:

# -*- coding: utf-8 -*-

from scrapy.http.request import Request
from scrapy.spider import BaseSpider

class xyzspider(BaseSpider):
    name = 'dspider'
    allowed_domains = ["www.example.com"]
    mylist = ['Search item 1','Search item 2']
    url = 'https://example.com/search?q='

    def start_requests(self):
        for i in self.mylist:
            i = i.replace(' ','+')
            starturl = self.url+ i

            yield Request(starturl,self.parse)

    def parse(self,response):
        itemurl =  response.xpath(".//section[contains(@class, 'search-results')]/a/@href").extract()
        for j in itemurl:
            print j
            yield Request(j,self.parse_item)

    def parse_item(self,response):
        print "hello"

        '''rating = response.xpath(".//ul(@class = 'ratings')/li[1]/span[1]/text()").extract()
        print rating'''

有谁可以帮助我。谢谢。

2 个答案:

答案 0 :(得分:1)

我收到已过滤的异地请求错误。我将允许的域名从allowed_domains = www.xyz.com更改为 xyz.com它完美无缺。

答案 1 :(得分:1)

您的代码看起来不错。因此,您可能需要将Request属性dont_filter设置为True:

yield Request(j,self.parse_item, dont_filter=True)

来自docs

  

dont_filter(boolean) - 表示调度程序不应过滤此请求。当您想要多次执行相同的请求时,可以使用此选项来忽略重复过滤器。小心使用它,否则您将进入爬行循环。默认为False。

无论如何,我建议你看一下项目管道。 这些用于使用以下命令处理已删除的项目:

yield my_object

Item pipelines用于对蜘蛛产生的所有内容进行后期处理。