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定时检查启动某个exe程序适合检测exe是否挂了
Jan 21 Python
Python实现的一个简单LRU cache
Sep 26 Python
详解在Python程序中使用Cookie的教程
Apr 30 Python
Python 实现链表实例代码
Apr 07 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
django反向解析和正向解析的方式
Jun 05 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 Python
python numpy库linspace相同间隔采样的实现
Feb 25 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
Python实现像awk一样分割字符串
Sep 15 Python
python复合条件下的字典排序
Dec 18 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中文件上传的安全问题
2006/10/09 PHP
PHP json_encode中文乱码问题的解决办法
2013/09/09 PHP
php技巧小结【推荐】
2017/01/19 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
javascript读写json示例
2014/04/11 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python定时器使用示例分享
2014/02/16 Python
Python 多线程Threading初学教程
2017/08/22 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
pycharm安装及如何导入numpy
2020/04/03 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
胡雪岩故居导游词
2015/02/06 职场文书
大四学生个人总结
2015/02/15 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
初三语文教学反思
2016/03/03 职场文书
创业计划之特色精品店
2019/08/12 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python