1、如果有代码无误却爬取不了的状况,那么一个可能是网络不好,另一个可能就是服务器拒绝响应,这种的话一般可以配置一下请求头,伪装成浏览器的爬虫。
例如我们可以在setting.py中,添加以下代码:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.74'
如图所示:
2、最容易出错的地方就是爬虫类的编写。该文件也是最主要的
例如,以下是我爬取豆瓣书籍top250的一个项目文件bookspider.py
import scrapy
from doubanbook.items import DoubanbookItem
class BookspiderSpider(scrapy.Spider):
name = "bookspider"
allowed_domains = ["book.douban.com"]
start_urls = ["https://book.douban.com/top250"]
def parse(self, response):
div_selector = response.xpath("//div[@class='indent']/table")#已debug,长度为25
print(len(div_selector))
for one_selector in div_selector:
#标题
title = one_selector.xpath("tr[@class='item']/td/div[@class='pl2']/a/text()").extract()[0]
#主要信息
detail =one_selector.xpath("tr[@class='item']/td/p[@class='pl']/text()").extract()[0]
#评分
score = one_selector.xpath("tr[@class='item']/td/div[@class='star clearfix']/span[@class='rating_nums']/text()").extract()[0]
#异常处理机制,如果有summaries可以爬,就爬;如果没有,就直接视为空格录入csv文件
try:
#总结
summaries = one_selector.xpath("tr[@class='item']/td/p/span[@class='inq']/text()").extract()[0]
if summaries:
book = DoubanbookItem(title=title,detail=detail,score=score, summaries=summaries)
yield book
# print(summaries)
except Exception :
book = DoubanbookItem(title=title, detail=detail, score=score, summaries=" ")
yield book
#翻页(如果有的话)
try:
next_url = response.xpath("//div[@class='paginator']/span[@class='next']/a/@href").extract()[0]
if next_url:
yield scrapy.Request(url=next_url, callback=self.parse)
except Exception as e:
self.logger.error(f"An error occurred: {e}")
(1)首先就是response对象中xpath属性规则的编写,一定要一层层往里定位,不要跳层,哪怕写错一个符号,都可能无法爬取【地址都给错了,爬虫根本就找不到,你说怎么爬】
(2)还有一个很重要的,也是我在该项目遇到的问题。例如这250本书,有一些是没有写总结信息的,所以一旦爬到该本书,就会报错,爬虫就不再爬了。所以要加入异常处理机制
【try-except Exception】,当爬到某本书发现该书缺了某个信息的时候,就将该信息记为空进行储存,然后再继续爬下一本。通过异常处理机制,我也顺利爬取成功.
精彩内容
发表评论