Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在scrapy中同时运行管道和抓取多个URL?_Python_Web Scraping_Scrapy - Fatal编程技术网

Python 是否可以在scrapy中同时运行管道和抓取多个URL?

Python 是否可以在scrapy中同时运行管道和抓取多个URL?,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我的蜘蛛看起来像这样 从scrapy.LinkExtractor导入LinkExtractor 从scrapy.spider导入爬行蜘蛛,规则 从scrapy.http导入请求 从ProjectName.items导入ProjectName 类蜘蛛名称蜘蛛(爬行蜘蛛): 名称='spidername' 允许的_域=['webaddress'] start_url=['webaddress/query1'] 规则=( 规则(LinkExtractor(restrict_css='horizonta

我的蜘蛛看起来像这样

从scrapy.LinkExtractor导入LinkExtractor
从scrapy.spider导入爬行蜘蛛,规则
从scrapy.http导入请求
从ProjectName.items导入ProjectName
类蜘蛛名称蜘蛛(爬行蜘蛛):
名称='spidername'
允许的_域=['webaddress']
start_url=['webaddress/query1']
规则=(
规则(LinkExtractor(restrict_css='horizontal css')),
规则(LinkExtractor(restrict_css='vertical css'),
callback='parse_item')
)
def解析_项(自身、响应):
item=ProjectName()
1_css='css1::text'
item['1']=response.css(1_css.extract())
item=ProjectName()
2_css='css2::text'
item['2']=response.css(2_css.extract())
退货项目
我的管道是这样的:

from scrapy.exceptions import DropItem

class RemoveIncompletePipeline(object):
    def reminc_item(self, item, spider):
        if item['1']:
            return item
        else:
            raise DropItem("Missing content in %s" % item)
一切正常,当字段1的值丢失时,从输出中取出相应项

但是,当我更改
start\u url
以执行多个查询时,如下所示:

f=open(“querys.txt”)
start_url=[url.strip()表示f.readlines()中的url]
f、 关闭()
或者像这样:

from scrapy.exceptions import DropItem

class RemoveIncompletePipeline(object):
    def reminc_item(self, item, spider):
        if item['1']:
            return item
        else:
            raise DropItem("Missing content in %s" % item)
start_url=[i.strip()表示打开('querys.txt').readlines()]
然后,输出包含字段1缺少值的项

发生什么事了?我怎样才能避免呢

对于记录
querys.txt
,如下所示:

网址/查询1
网址/查询2

根据,您应该覆盖
start\u请求
方法

此方法必须返回第一个爬网请求的iterable 为了这只蜘蛛

这是Scrapy在打开spider时调用的方法 未指定特定URL时进行刮取。如果特定的URL是 指定时,将使用make_requests_from_url()来创建 请求。此方法也只能从Scrapy调用一次,因此 可以安全地将其作为发电机来执行

UPD: 只需将此代码放入您的spider类

def start_requests(self):
    return [scrapy.Request(i.strip(), callback=self.parse_item) for i in open('queries.txt').readlines()]
UPD: 您的
parse_item
方法中的逻辑错误。你需要修理它

def parse_item(self, response):
    for job in response.css('div.card-top')
        item = ProjectName()
        # just quick example.
        item['city'] = job.xpath('string(//span[@class="serp-location"])').extract()[0].replace(' ', '').replace('\n', '')
        # TODO: you should fill other item fields
        # ...
        yeild item
根据,您应该覆盖
start\u请求
方法

此方法必须返回第一个爬网请求的iterable 为了这只蜘蛛

这是Scrapy在打开spider时调用的方法 未指定特定URL时进行刮取。如果特定的URL是 指定时,将使用make_requests_from_url()来创建 请求。此方法也只能从Scrapy调用一次,因此 可以安全地将其作为发电机来执行

UPD: 只需将此代码放入您的spider类

def start_requests(self):
    return [scrapy.Request(i.strip(), callback=self.parse_item) for i in open('queries.txt').readlines()]
UPD: 您的
parse_item
方法中的逻辑错误。你需要修理它

def parse_item(self, response):
    for job in response.css('div.card-top')
        item = ProjectName()
        # just quick example.
        item['city'] = job.xpath('string(//span[@class="serp-location"])').extract()[0].replace(' ', '').replace('\n', '')
        # TODO: you should fill other item fields
        # ...
        yeild item

@rook,thx for the editOut of interest,URL是否在同一服务器/域上?如果是这样的话,你就不会想将它们并行化,除非你确定命中率不会让你IP被阻止。事实上,它们来自同一个域,因为这是关于在搜索引擎上输入查询,搜索结果是域内的链接。您建议如何避免被阻止?到目前为止,我还没有被阻止,因为我没有检索到超过50个项目进行测试。我想得到大约50万个条目,分为15到30个查询。这是一个非常大的刮取量,一般来说,假设这50万个条目中的每一个都是单独的HTTP请求,我希望即使没有并行化,您也会被阻止。@rook,thx for the editOut of interest,URL是否在同一服务器/域上?如果是这样的话,你就不会想将它们并行化,除非你确定命中率不会让你IP被阻止。事实上,它们来自同一个域,因为这是关于在搜索引擎上输入查询,搜索结果是域内的链接。您建议如何避免被阻止?到目前为止,我还没有被阻止,因为我没有检索到超过50个项目进行测试。我想得到大约50万个条目,分为15到30个查询。这是一个非常大的刮取量,一般来说,我预计即使没有并行化,您也会被阻止,假设这50万个条目中的每一个都是单独的HTTP请求。Thx很多,我会尝试。我应该离开
start\u url=['webaddress/query1']
?不起作用,下面是您的
parse\u项
方法中出现一些错误的原因。我纠正了错误,再检查一次。如果选择器有问题,请提出新问题。你的日志显示了scrapy对多个起始URL的调用,这个问题已经解决了我使用的
parse\u item
方法就是从中获取的。我用
scrapyshell
检查了我所有的选择器,它们似乎都能完成任务。不管怎样,spider工作得很好,只是管道的
DropIIem
似乎被start\u url循环激活了。我无法实现您提出的解决方案,也没有得到job in response.css('div.card-top')部分的
。我想我会手动启动每个查询,我没有那么多。看,只要用你的蜘蛛的完整代码(所有选择器和链接)提出一个新问题,我会检查你的代码。
start\u url
的问题已经解决。谢谢,我会试试看。我应该离开
start\u url=['webaddress/query1']
?不起作用,下面是您的
parse\u项
方法中出现一些错误的原因。我纠正了错误,再检查一次。如果选择器有问题,请提出新问题。你的日志显示了scrapy对多个起始URL的调用,这个问题已经解决了我使用的
parse\u item
方法就是从中获取的。我用
scrapyshell
检查了我所有的选择器,它们似乎都能完成任务。不管怎样,spider工作正常,只是管道的
dropiItem
似乎被