网络编程
位置:首页>> 网络编程>> Python编程>> scrapy实践之翻页爬取的实现

scrapy实践之翻页爬取的实现

作者:生信修炼手册  发布时间:2023-09-25 23:09:26 

标签:scrapy,翻页,爬取

安装

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,
}

对于标准的多页表格数据,采用上述的代码可以轻松实现翻页效果,非常的方便。

来源:https://blog.csdn.net/weixin_43569478/article/details/109542069

0
投稿

猜你喜欢

  • 由于项目的需要在一个页面中选择打印内容。 把自己要打印的东西用一个DIV层抱起来。例如: <!-- 信访事项转办告知单Start --
  • 函数的基本结构Python中的函数基本结构:def 函数名([参数列表]):    语句 几点说明:
  • 对于在外的游子,每逢佳节倍思亲。而对于996ICU的苦逼程序猿们,最期待的莫过于各种节假日能把自己丢在床上好好休息一下了。这几天各公司都陆续
  • 内容摘要:图片切换效果在网页制作中经常被使用,好的切换效果不仅增加了网站的实用行也提升了网站的趣味性。而图片切换方法有的使用flash来实现
  • messageboxtkinter.messagebox中封装了多种消息框,其输入参数统一为title, message以及其他参数。其中t
  • Python下实现定时任务的方式有很多种方式。下面介绍几种循环sleep:这是一种最简单的方式,在循环里放入要执行的任务,然后sleep一段
  • CSS hack是指我们为了兼容各浏览器,而使用的特别的css定义技巧。这是国外摘来的一张CSS hack列表,显示了各浏览器对css ha
  • Web Forms 2.0 是一个很有意思的东东,是 HTML 5 的组成部分。它的目标是提升表单的使用性 (usability),基本上就
  • python的requests它是python的一个第三方库,处理URL比urllib这个库要方便的多,并且功能也很丰富。【可以先看4,5表
  • 在编写 XMLHttpRequest 请求时,需要掌握服务器端返回的内容。针对 Firefox 浏览器,我们常用的 Firebug 就能非常
  •   别人复制你网站的文章时自动加上注释,这个功能你在很多网站应该都有体会过,当我们复制一段内容时,就自动在文章后面加上了网站的一些
  • 一、截取子串-切片方法:字符串名[初始位置:结束位置:步长]str1 = 'abcdefg'print(str1[:]) #
  • vue3给数组赋值丢失响应式的解决由于vue3使用proxy,对于对象和数组都不能直接整个赋值。只有push或者根据索引遍历赋值才可以保留r
  • 前言只统计像素的灰度值这一特征,可将其成为一维直方图。二维直方图可以统计像素的色相和饱和度,用于查找图像的颜色直方图。一、OpenCV中的二
  • 一、介绍argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.ar
  • Pygame的Font文本和字体Pygame 通过pygame.font模块来创建一个字体对象,从而实现绘制文本的目的。该模块的常用方法如下
  • ECMAScript5为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象(即影响th
  • 最近在使用linux上进行本地登录时,发现既然无法正常登录 , 报如下错误信息:[root@xxxx ~]# mysql -h localh
  • 本文记录了mysql 8.0.14 安装配置的过程,供大家参考,具体内容如下1.下载地址:下载地址找到zip压缩文件.2.配置环境变量把解压
  • 本文实例为大家分享了Bootstrap组合上下拉框的具体代码,供大家参考,具体内容如下<html><head><
手机版 网络编程 asp之家 www.aspxhome.com