开始网址scrapy中的迭代次序

时间:2015-11-12 04:50:08

标签: python web-scraping scrapy

我在csv文件中有一个url列表,我在pandas数据框中加载此文件,并使用列链接作为起始URL

start_urls =  df['Links']

每个链接都有这种格式

http://www.bbb.org/search/?type=name&input=%28408%29+998-0983&location=&tobid=&filter=business&radius=&country=USA%2CCAN&language=en&codeType=YPPA

此链接与电话号码(408)998-0983有关,该链接在链接中显示为%28408%29 + 998-0983

对于df['Links']中的每个页面,我废弃了一些数据,并将其保存在一个项目中,到目前为止一直很好,我遇到的问题是scich中的顺序与列表的顺序不一样是数据框,所以我不能合并我得到的数据与scrapy和我已经拥有的文件因为行不匹配,我也想在页面没有数据时处理异常返回一个字符串,我可以用这部分代码完成,这就是我现在正在做的事情:

def parse(self, response):




    producto = Product()
    producto = Product(BBB_link = response.xpath('//*[@id="container"]/div/div[1]/div[3]/table/tbody/tr[1]/td/h4[1]/a').extract()

2 个答案:

答案 0 :(得分:1)

Scrapy以asynchronous种方式工作,这就是为什么你的想法不起作用的原因。一个可行的解决方案是将“request.url”或“response.url”与刮下的结果一起保存在新生成的output.csv中

对于问题的第2部分,您是否尝试过try & except

producto = Product()
try:
    producto = Product(BBB_link = response.xpath('//*[@id="container"]/div/div[1]/div[3]/table/tbody/tr[1]/td/h4[1]/a').extract()
except:
    producto = 'n/a'

答案 1 :(得分:1)

问题的第一部分已经回答here,建议覆盖start_requests()以添加元数据。在您的情况下,我想您可以将电话号码添加为元数据,但任何方便的数据框链接都可以。删除数据的顺序不会改变,但您将有足够的信息与数据库或电子表格中的原始数据相关联。

class MySpider(CrawlSpider):

    def start_requests(self):
        ...
        yield Request(url1, meta={'phone_no': '(408) 998-0983'}, callback=self.parse)
        ...

def parse(self, response):
    item['phone_no'] = response.meta['phone_no']

对于未找到数据的情况,您可以测试xpath返回的列表。如果它是空的,则找不到任何东西。

producto = Product(BBB_link = response.xpath('//*[@id="container"]/div/div[1]/div[3]/table/tbody/tr[1]/td/h4[1]/a').extract()
if producto:
    <parse the page as normal>
    item['status'] = 'found ok'
else:
    item['status'] = 'not found'

yield item