赞
踩
上篇内容我们只把第一页内容爬取了下来,这次我们看下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)
爬取的效果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。