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之集合(set)
Sep 24 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
python中函数传参详解
Jul 03 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
May 08 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
Python 堆叠柱状图绘制方法
Jul 29 Python
python爬虫 爬取超清壁纸代码实例
Aug 16 Python
django修改models重建数据库的操作
Mar 31 Python
win10从零安装配置pytorch全过程图文详解
May 08 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 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读取javascript设置的cookies的代码
2010/04/12 PHP
php 无限级数据JSON格式及JS解析
2010/07/17 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
2013/10/15 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
Python获取远程文件大小的函数代码分享
2014/05/13 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python删除字符串中指定字符的方法
2018/08/13 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
python3实现点餐系统
2019/01/24 Python
Python3标准库总结
2019/02/19 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
如何开发一个JQuery插件
2016/07/28 面试题
师生聚会感言
2014/01/26 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
开学典礼策划方案
2014/05/28 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
Python Django获取URL中的数据详解
2021/11/01 Python