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实现监控linux性能及进程消耗性能的方法
Jul 25 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
Python之用户输入的实例
Jun 22 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Python的条件锁与事件共享详解
Sep 12 Python
关于python 跨域处理方式详解
Mar 28 Python
python函数map()和partial()的知识点总结
May 26 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 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 empty()与isset()区别的详细介绍
2013/06/17 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
extjs render 用法介绍
2013/09/11 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
js实现星星打分效果的方法
2020/07/05 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
2017/07/27 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
python中list列表的高级函数
2016/05/17 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
Python requests设置代理的方法步骤
2020/02/23 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
电脑饰品店的创业计划书
2014/01/21 职场文书
学习决心书
2014/03/11 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
中学图书馆工作总结
2015/08/11 职场文书