为什么要伪装:因为有很多网站是拒绝爬虫访问,所以要使用Request对象把爬虫伪装成浏览器访问
重设解析数据回调函数:在系列一文章里面我们把爬虫的数据解析的具体实现写在了Scrapy默认的parse方法里,如果要指定别的数据解析回调函数,则需要指定新的解析数据的回调函数
重写start_requests()方法
在系列一的基础上修改
qidian_headers,User-Agent对应的值为图2马赛克区域,直接一整段复制进去就OK
start_requests()方法返回Request对象的参数:
url:这个不用说了
headers:就是上面设置的用户代理
callback:重设解析数据的回调函数
图2.
完整代码
from scrapy import Request
from scrapy.spiders import Spider
class HotSalesSpider(Spider):
# 爬虫名称
name = "hot"
#设置用户代理为浏览器类型
qidian_headers = {"User-Agent" : "Mozilla***************************************"}
def start_requests(self):
url = "https://www.qidian.com/rank/hotsales?style=1&page=1"
yield Request(url, headers=self.qidian_headers, callback=self.qidian_parse)
#数据解析,此时response对象已经有网页的html数据
def qidian_parse(self, response):
#使用xpath定位到小说内容的div元素
list_selector = response.xpath("//div[@class='book-mid-info']")
#读取每部小说的元素
for one_selector in list_selector:
#获取小说名称
name = one_selector.xpath("h4/a/text()").extract()[0]
#获取作者,第一个p标签的第一个a标签的内容
author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]
#获取类型
type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]
#获取形式
form = one_selector.xpath("p[1]/span/text()").extract()[0]
#把爬取的数据保存到字典
hot_dict = {
"name" : name,
"author" : author,
"type" : type,
"form" : form
}
yield hot_dict