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根据路径导入模块的方法
Sep 30 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
Python使用OpenCV进行标定
May 08 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
Python切片操作深入详解
Jul 27 Python
python写一个随机点名软件的实例
Nov 28 Python
np.dot()函数的用法详解
Jan 17 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
python 如何引入协程和原理分析
Nov 30 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
Bootstrap每天必学之栅格系统(布局)
2015/11/25 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
JS路由跳转的简单实现代码
2017/09/21 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
python常用函数详解
2016/09/13 Python
python实现飞机大战微信小游戏
2020/03/21 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
总务岗位职责
2013/11/19 职场文书
2014年优秀党员材料
2014/12/18 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
外出听课学习心得体会
2016/01/15 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
基于Go语言构建RESTful API服务
2021/07/25 Golang
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
SQL Server实现分页方法介绍
2022/03/16 SQL Server