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中for循环详解
Jan 17 Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 Python
Python的Django中django-userena组件的简单使用教程
May 30 Python
解决Python传递中文参数的问题
Aug 04 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
Mar 24 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
Django CBV类的用法详解
Jul 26 Python
python保存log日志,实现用log日志画图
Dec 24 Python
Python itertools.product方法代码实例
Mar 27 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 Python
Python数据模型与Python对象模型的相关总结
Jan 26 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 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中的UNICODE 编码与解码
2013/06/29 PHP
PHP中的替代语法介绍
2015/01/09 PHP
php里array_work用法实例分析
2015/07/13 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
比较完整的微信开发php代码
2016/08/02 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
jQuery的一些注意
2006/12/06 Javascript
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
python性能测试工具locust的使用
2020/12/28 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
介绍一下linux文件系统分配策略
2012/11/17 面试题
后勤采购员岗位职责
2013/12/19 职场文书
环保建议书100字
2014/05/14 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
详解Nginx 工作原理
2021/03/31 Servers
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers