scrapy实践之翻页爬取的实现


Posted in Python onJanuary 05, 2021

安装

Scrapy的安装很简单,官方文档也有详细的说明 http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html 。这里不详细说明了。

在scrapy框架中,spider具有以下几个功能

1. 定义初始爬取的url

2. 定义爬取的行为,是否跟进链接

3. 从网页中提取结构化数据

所谓的跟进链接,其实就是自动爬取该页的所有链接,然后顺着对应的链接延伸开来不断爬取,这样只需要提供一个网站首页,理论上就可以实现网站全部页面的爬取,实现点到面的功能。

如果自己来开发,不仅需要在算法层面,考虑是使用深度优先还是广度优先,还需要处理好提取的url的限制条件等细节工作。在scrapy中,开发过程被大大简化了,我们只需要定义以下几个关键部分的代码,就可以实现翻页效果。

1. Spider

核心思想是在parse方法中,返回新的Requests请求,代码如下

import scrapy
 
from hello_world.items import HelloWorldItem
 
class MirSpider(scrapy.Spider):
  name = "MirSpider"
  start_urls = ["http://mirtarbase.cuhk.edu.cn/php/search.php?opt=species&org=bta&sort=id&order=asc&page=1"]
 
  def parse(self, response):
    domain = 'http://mirtarbase.cuhk.edu.cn'
    for row in response.xpath('//table/tr'):
      item = HelloWorldItem()
      res = []
      for col in (row.xpath('td/text()')):
        res.append(col.extract())
      if res[0] != 'Bos taurus':
        continue
      item['species'] = res[0]
      item['miRNA'] = res[2]
      item['target'] = res[3]
      item['total'] = res[4]
      item['papers'] = res[5]
      yield item
    for url in response.xpath('//a/@href').extract():
      if 'page' in url:
        url = domain + url
        yield scrapy.Request(url, callback = self.parse, dont_filter = False)

关键代码是最后几行的for循环,在start_urls中,我们只提供了一个初识的url, 在parse方法中,除了常规的返回结构性数据item外,我们还返回了新的requests请求,首先提取页面上所有的url, 并对url的链接进行了限制,对需要爬取的url链接以Request的方法进行返回,注意dont_filter的设置,当设置为False时,会调用scrapy默认的url去重机制,这样不会重复下载。

2. Item Pipeline

对于下载的item, 有些会出现重复的现象,此时可以在pipelines.py中,对item进行操作,实现item去重的代码如下

from itemadapter import ItemAdapter
 
 
class HelloWorldPipeline:
  def __init__(self):
    self.link_set = set()
 
  def process_item(self, item, spider):
    link = item['miRNA'] + item['target']
    if link in self.link_set:
      raise DropItem(item)
    self.link_set.add(link) 
    return item

在process_item方法中,通过一个set对象来达到去重的效果。需要注意,默认pipelines是没有开启的,编写完代码之后,需要在settings.py中进行配置,开启对应的pipeline, 内容如下

ITEM_PIPELINES = {
  'hello_world.pipelines.HelloWorldPipeline': 300,
}

对于标准的多页表格数据,采用上述的代码可以轻松实现翻页效果,非常的方便。

到此这篇关于scrapy实践之翻页爬取的实现的文章就介绍到这了,更多相关scrapy 翻页爬取内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中decorator使用实例
Apr 14 Python
python MySQLdb使用教程详解
Mar 20 Python
Python中反射和描述器总结
Sep 23 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
Python实现的KMeans聚类算法实例分析
Dec 29 Python
python创建与遍历List二维列表的方法
Aug 16 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
jupyter notebook 多行输出实例
Apr 09 Python
Python类型转换的魔术方法详解
Dec 23 Python
python里glob模块知识点总结
Jan 05 #Python
python用opencv 图像傅里叶变换
Jan 04 #Python
python基于opencv 实现图像时钟
Jan 04 #Python
python基于opencv实现人脸识别
Jan 04 #Python
利用python绘制正态分布曲线
Jan 04 #Python
Python 打印自己设计的字体的实例讲解
Jan 04 #Python
Python关于拓扑排序知识点讲解
Jan 04 #Python
You might like
提取HTML标签
2006/10/09 PHP
PHP的FTP学习(一)
2006/10/09 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
python定时检查启动某个exe程序适合检测exe是否挂了
2013/01/21 Python
跟老齐学Python之Python安装
2014/09/12 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
python pandas生成时间列表
2019/06/29 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
什么是python的id函数
2020/06/11 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
什么是.net
2015/08/03 面试题
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
应用电子专业学生的自我评价
2013/10/16 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2014年城管工作总结
2014/11/20 职场文书
2014年体育工作总结
2014/11/24 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
zabbix配置nginx监控的实现
2022/05/25 Servers