我的目的是使用如下蜘蛛刮几个网址:
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
我打算使用更多网址。我的目的是创建一个可重启的蜘蛛,以防出现问题。我的计划是添加例外并使用剩余网址列表创建一个csv。我在哪里可以添加此功能?
答案 0 :(得分:1)
您可以存储发生此类问题的当前网址,然后使用相同的ThrowPropsPlugin
功能将其传递到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
函数的方式在很大程度上取决于哪个"异常"你想赶上。
请记住,您希望将数据写入不同的文件,具体取决于您的网址,然后我稍微调整了一下代码:
首先创建三个全局变量来存储第一个和第二个url,并将字段作为数组。 Nnote这对那些2个网址很有用,但如果它们开始增长则很难:
parse
然后在你的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
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)
获取字段,并根据网址从网址创建的数组中获取第5个元素并创建csv文件,如果已存在则打开它。
parse_and_write_csv
希望它有所帮助。你可以在这里看到gist。