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】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
Django 反向生成url实例详解
Jul 30 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 Python
基于Python的自媒体小助手---登录页面的实现代码
Jun 29 Python
python中的django是做什么的
Jul 31 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
PHP操作数组相关函数
2011/02/03 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
Python遍历目录中的所有文件的方法
2016/07/08 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
python 通过文件夹导入包的操作
2020/06/01 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
利用python进行文件操作
2020/12/04 Python
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
自我鉴定的范文
2013/10/03 职场文书
办公室年终个人自我评价
2013/10/28 职场文书
作风转变心得体会
2014/09/02 职场文书
给老婆的保证书
2015/01/16 职场文书
2015年库房工作总结
2015/04/30 职场文书
开学典礼观后感
2015/06/15 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL
Oracle中日期的使用方法实例
2022/07/07 Oracle