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】,当爬到某本书发现该书缺了某个信息的时候,就将该信息记为空进行储存,然后再继续爬下一本。通过异常处理机制,我也顺利爬取成功.

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: