上篇内容我们只把第一页内容爬取了下来,这次我们看下scrapy中的分页是怎么查询出来的。
在上篇的代码基础上我们修改spiders下的代码:
要注意和之前不同的地方。
import scrapy
from first_project.items import FirstProjectItem
#爬虫继承scrapy.Spider
class QiushibaikeSpider(scrapy.Spider):
# 当前爬虫的名字,一个项目中唯一,后面启动当前爬虫使用这个name
name = 'qiushibaike'
# 当前爬虫的网址域名起到限定作用
allowed_domains = ['qiushibaike.com']
# 爬虫的起始url,scrapy会首先请求这个里面配置的url,
# 然后把返回的结果传递给下面的parse函数,response参数就是返回的内容
start_urls = ['https://www.qiushibaike.com/8hr/page/1/']
BASE_URL='https://www.qiushibaike.com'
def parse(self, response):
# response是一个HtmlResponse对象,可以用它获取返回的内容response.text,使用xpath获取内容response.xpath("..")
print("*************************")
responseContent = response.xpath("//div[@class='recmd-right']")
for i in responseContent:
author=i.xpath(".//span[@class='recmd-name']/text()").get()
title=i.xpath(".//a[@class='recmd-content']/text()").get()
#把数据转为字典
# data={"author": author,"title":title}
data=FirstProjectItem(author=author,title=title)
#把数据转给pipelines,需要使用 yield, 代表把数据转给底层框架,然后框架会转给pipelines.py文件中
yield data
###开始分页查询
#首先我们要找到下一页 地址
next_url= response.xpath("//ul[@class='pagination']/li[last()]/a/@href").get()
print(next_url)
current_page=response.xpath("//ul[@class='pagination']/li/span[@class='current']/text()").get()
if current_page:
print('当前页数'+current_page)
#因为页面到最后一页之后下一页就会变成首页,所以到这里就要停止
if next_url=='/hot/':
return
else:
#把请求yield出去交给框架处理,注意我这里加了meta参数,是防止重定向的,不然我这里直接请求会重定向别的错误地址
yield scrapy.Request(self.BASE_URL+next_url,meta={
'dont_redirect': True,
'handle_httpstatus_list': [302,301]
},callback=self.parse)
爬取的效果如下: