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自动化测试之setUp与tearDown实例
Sep 28 Python
简单介绍Python中的RSS处理
Apr 13 Python
Python中数字以及算数运算符的相关使用
Oct 12 Python
Linux系统上Nginx+Python的web.py与Django框架环境
Dec 25 Python
Python实现确认字符串是否包含指定字符串的实例
May 02 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
python super用法及原理详解
Jan 20 Python
python计算导数并绘图的实例
Feb 29 Python
Python使用re模块验证危险字符
May 21 Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 Python
Python3中最常用的5种线程锁实例总结
Jul 07 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中10个不常见却非常有用的函数
2010/03/21 PHP
微信支付开发维权通知实例
2016/07/12 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
解javascript 混淆加密收藏
2009/01/16 Javascript
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
ES6箭头函数和扩展实例分析
2020/05/23 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
python循环监控远程端口的方法
2015/03/14 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
学习python可以干什么
2019/02/26 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
实现Python与STM32通信方式
2019/12/18 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
优秀团员自我评价范文
2014/04/23 职场文书
场地使用证明模板
2014/10/25 职场文书
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android