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 相关文章推荐
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
详解Python网络爬虫功能的基本写法
Jan 28 Python
python+pygame简单画板实现代码实例
Dec 13 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
Aug 05 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
python3 求约数的实例
Dec 05 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
Python机器学习之逻辑回归
May 11 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颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
php多文件上传实现代码
2014/02/20 PHP
php代码架构的八点注意事项
2016/01/25 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
浅谈python 线程池threadpool之实现
2017/11/17 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
numpy中索引和切片详解
2017/12/15 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
Python Process多进程实现过程
2019/10/22 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Django密码存储策略分析
2020/01/09 Python
美国性感内衣店:Yandy
2018/06/12 全球购物
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
倡议书格式
2014/04/14 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
温馨提示标语
2014/06/26 职场文书
升职自荐信范文
2015/03/27 职场文书
党员承诺书格式范文
2015/04/28 职场文书
芙蓉镇观后感
2015/06/10 职场文书