【发布时间】:2018-01-01 03:48:46
【问题描述】:
我正在尝试从一个网站获取数据,该网站需要我在抓取数据之前遵循 2 个 URL。
目标是得到一个如下所示的导出文件:
我的代码如下:
import scrapy
from scrapy.item import Item, Field
from scrapy import Request
class myItems(Item):
info1 = Field()
info2 = Field()
info3 = Field()
info4 = Field()
class mySpider(scrapy.Spider):
name = 'techbot'
start_urls = ['']
def parse(self, response):
#Extracts first link
items = []
list1 = response.css("").extract() #extract all info from here
for i in list1:
link1 = 'https:...' + str(i)
request = Request(link1, self.parseInfo1, dont_filter =True)
request.meta['item'] = items
yield request
yield items
def parseInfo1(self, response):
#Extracts second link
item = myItems()
items = response.meta['item']
list1 = response.css("").extract()
for i in list1:
link1 = '' + str(i)
request = Request(link1, self.parseInfo2, dont_filter =True)
request.meta['item'] = items
items.append(item)
return request
def parseInfo2(self, response):
#Extracts all data
item = myItems()
items = response.meta['item']
item['info1'] = response.css("").extract()
item['info2'] = response.css("").extract()
item['info3'] = response.css("").extract()
item['info4'] = response.css("").extract()
items.append(item)
return items
我已经在终端中使用以下命令执行了蜘蛛:
scrapy crawl techbot
我得到的数据是乱序的,并且有这样的空白:
例如它多次抓取第一组数据,其余的都是乱序的。
如果有人能指出我以更清晰的格式获得结果的方向,如开头所示,将不胜感激。
谢谢
【问题讨论】:
-
使用
print()来查看代码中发生了什么 - 看看什么/什么时候你得到了变量。 -
如果你添加真实的 url 然后我们可以测试它并查看问题。目前是不可能的。
-
你不应该使用
yield而不是return和Request吗? -
我认为在
parseInfo2你可以yield/return单item。我不知道你为什么使用列表items = []。 -
你得到列表
list1 = response.css("").extract(),然后你用link1 = 'https:...' + str(i)替换它 - 为什么?
标签: python csv web-scraping scrapy