我的意图是使用一个蜘蛛刮几个urls,如下所示:
import scrapy
from ..items import ContentsPageSFBItem
class BasicSpider(scrapy.Spider):
name = "contentspage_sfb"
#allowed_domains = ["web"]
start_urls = [
'https://www.safaribooksonline.com/library/view/shell-programming-in/9780134496696/',
'https://www.safaribooksonline.com/library/view/cisa-certified-information/9780134677453/'
]
def parse(self, response):
item = ContentsPageSFBItem()
#from scrapy.shell import inspect_response
#inspect_response(response, self)
content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract()
for content_item in content_items:
item['content_item'] = content_item
item["full_url"] = response.url
item['title'] = response.xpath('//title[1]/text()').extract()
yield item我打算用更多的网址。我的意图是创造一个可重新启动的蜘蛛,以防出问题。我的计划是添加异常并创建包含剩余urls列表的csv。我到底能在哪里添加这个功能?
发布于 2017-05-17 22:18:29
您可以存储发生此类问题的当前url,然后使用相同的scrapy.Request函数将其传递到parse中继续。
您可以看到在使用response.body访问的网站上是否已经打印了一些内容,是不是已经发生了一些不好的事情,那么yield就会有一个新的scrapy.Request,如果不继续正常的话。
也许:
def parse(self, response):
current_url = response.request.url
if 'Some or none message in the body' in response.body:
yield scrapy.Request(current_url, callback=self.parse)
else:
item = ContentsPageSFBItem()
content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract()
for content_item in content_items:
item['content_item'] = content_item
item['full_url'] = response.url
item['title'] = response.xpath('//title[1]/text()').extract()
yield item请注意,再次使用parse函数的方式在很大程度上取决于您想要捕获的“异常”。
请记住,您希望将数据写入不同的文件,这取决于您的url,然后我对代码做了一些调整:
首先创建三个全局变量来存储第一个和第二个url,并将字段作为数组存储。请注意,这对于这两个urls是有用的,但是如果它们开始增长,这将很困难:
global first_url, second_url, fields
fields = []
first_url = 'https://www.safaribooksonline.com/library/view/shell-programming-in/9780134496696/'
second_url = 'https://www.safaribooksonline.com/library/view/cisa-certified-information/9780134677453/'
start_urls = [first_url, second_url]然后在parse函数中获取数据并将其存储在fields数组中,该数组将传递给第二个函数parse_and_write_csv,根据当前url在每个文件上创建和写入数据。
def parse(self, response):
item = ContentsPageSFBItem()
content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract()
url = response.request.url
for content_item in content_items:
item['content_item'] = content_item
item['full_url'] = response.url
item['title'] = response.xpath('//title[1]/text()').extract()
fields = [item['content_item'].encode('utf-8'), item['full_url'], item['title'][0]]
self.parse_and_write_csv(response, fields)parse_and_write_csv获取字段,并根据url获取从url创建的数组中的第5个元素,并创建一个csv文件,如果该文件已经存在,则打开它。
def parse_and_write_csv(self, response, fields):
with open("%s.csv" % response.request.url.split('/')[5], 'a+') as file:
file.write("{}\n".format(';'.join(str(field)
for field in fields)))希望能帮上忙。你可以在这里看到一个要旨。
https://stackoverflow.com/questions/44035221
复制相似问题