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易忽视知识点小结
May 25 Python
使用Python绘制图表大全总结
Feb 11 Python
Python向日志输出中添加上下文信息
May 24 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python for和else语句趣谈
Jul 02 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
Python变量作用域LEGB用法解析
Feb 04 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
Python Selenium 设置元素等待的三种方式
Mar 18 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
Python3.7安装pyaudio教程解析
Jul 24 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/06/24 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
Python下线程之间的共享和释放示例
2015/05/04 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
python 实现汉诺塔游戏
2020/11/28 Python
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
松材线虫病防治方案
2014/06/15 职场文书
新员工入职欢迎词
2015/01/23 职场文书
教师个人总结范文
2015/02/11 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书