我在 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']
中的每个页面,我废弃一些数据,并将其保存在一个项目中,到目前为止一切顺利,我遇到的问题是 scrapy 中的顺序接受的列表与数据框不同,所以我无法合并使用 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()
最佳答案
您问题的第一部分已得到解答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
关于python - scrapy 开始 url 中的迭代顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33664640/