爬虫笔记25:piplines文件的使用、简单案例:scrapy爬取古诗文网站(scrapy中的常用翻页方法)、

news/2024/5/8 13:22:46/文章来源:https://blog.csdn.net/weixin_49167820/article/details/118057003

一、piplines文件的使用
1、 开启管道
在settings.py文件中取消以下注释:
ITEM_PIPELINES = {
‘mySpider.pipelines.MyspiderPipeline’: 300,
}
在这里插入图片描述

2 、回到爬虫文件当中,把数据yield 给管道。
为什么是yield的原因:

  • 不会浪费内存
  • 翻页的逻辑 scrapy.Requst(url,callback,…) 通过yield来返回
    在这里插入图片描述
    3、在管道文件中打印或者保存等
    (1)打印举例
    在这里插入图片描述

(2)保存到txt文件举例
在这里插入图片描述
补充:(1)pipeline中process_item方法名不能修改为其他的名称
(2)管道当中的参数spider是什么?如下图:
在这里插入图片描述
从下图可知,它就是爬虫文件中的class DoubanSpider
在这里插入图片描述
见下图:
在这里插入图片描述

二、简单案例:scrapy爬取古诗文网站
需求: 爬取古诗文网站中的 诗词的 标题 作者 朝代 内容 以及翻页 并保存

第一步 页面分析

​(1)我们发现有2种翻页方式:(且有不同的url)
在这里插入图片描述
点击下一页的方式,url规律如下,
https://www.gushiwen.org/default_1.aspx 第一页
https://www.gushiwen.cn/default_2.aspx 第二页
https://www.gushiwen.cn/default_3.aspx 第三页
​那么,输入数字方式的url就可以忽略,https://www.gushiwen.cn/default.aspx?page=2 第二页 。
主域名:​’gushiwen.org’、 ‘gushiwen.cn’

(2)通过页面结构分析 :所有的诗词内容都是在class=left的div标签之中, 然后在去找它下面的每一个 sons对应一首诗,然后去遍历我们需要提取的数据。
在这里插入图片描述

第二步 实现步骤

1 创建scrapy项目
scrapy startproject gsSpider

2 创建爬虫
scrapy genspider gs gushiwen.cn

3 逻辑的实现
(1)因为有2个主域名,所以打开爬虫文件添加另一个主域名’gushiwen.org’,并将起始的url改成第一页的url
在这里插入图片描述
(2)编写解析函数
在这里插入图片描述

import scrapyclass GsSpider(scrapy.Spider):name = 'gs'allowed_domains = ['gushiwen.cn','gushiwen.org']start_urls = ['https://www.gushiwen.org/default_1.aspx']def parse(self, response):gsw_divs = response.xpath('//div[@class="left"]/div[@class="sons"]')for gsw_div in gsw_divs:title = gsw_div.xpath('.//b/text()').get()  #获取标题print(title)# 获取作者和朝代source = gsw_div.xpath('.//p[@class="source"]/a/text()').extract()# author = source[0]# dynasty = source[1]# print(author, dynasty)# 获取内容content_lst = gsw_div.xpath('.//div[@class="contson"]//text()').extract()content = ''.join(content_lst).strip()print(content)

备注:
① extract()是旧方法,其效果和getall()一样。
② join() 方法:以指定的方式把字符串或列表连接成一个新的字符串,并返回。
在这里插入图片描述
(3)注册items.py文件中的要素,并在爬虫文件中引用,并在管道文件中打印item
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述
结果没有问题,那么就保存数据。

(4)在管道中保存数据
在这里插入图片描述
注意:在使用json.dumps()转换数据时,是否要加dict这个小细节
结果:
在这里插入图片描述
我们在json.dumps()中添加参数:ensure_ascii=False

class GsspiderPipeline:def open_spider(self,spider):self.fp = open('gs.txt','w',encoding='utf-8')def process_item(self, item, spider):item_json = json.dumps(dict(item),ensure_ascii=False)self.fp.write(item_json + '\n')return itemdef close_spider(self,spider):self.fp.close()

补充:
json.dumps()
序列化:将“python字典数据结构”转换为“json字符串”。
json在进行序列化时,默认使用的编码是ASCII,而中文为Unicode编码,ASCII中不包含中文,所以出现了乱码。想要json.dumps()能正常显示中文,只要加入参数ensure_ascii=False即可,这样json在序列化的时候,就不会使用默认的ASCII编码。

结果:
在这里插入图片描述
(5)翻页的实现
我们检查发现,下一页按钮中有一个href属性的值,对应的就是下一页的url地址:
在这里插入图片描述
我们把爬虫文件中的解析函数先注释掉后,现在就只简单的实现翻页功能:
在这里插入图片描述
运行后得到的结果是一个selector,那么加上一个get()
在这里插入图片描述
这样就得到了下一页的url,同时我发现在第二页的检查中,得到的可能是下一页url的后缀,所以用urljoin()来补全地址。
因为页数一共有4页,在第4页的时候就没有下一页了,所以我们先用if做个存在的判断:
在这里插入图片描述

scrapy.Request(url=next_url,callback=self.parse)
url:请求的url
callback:回调函数,用于接收请求后的返回信息(也就是将响应作为参数传递给回调函数),若没指定,则默认为parse()函数

所以可以进一步简写成:
在这里插入图片描述
所以打开之前的注释,就是整个爬虫文件的代码:

import scrapy
from gsSpider.items import GsspiderItemclass GsSpider(scrapy.Spider):name = 'gs'allowed_domains = ['gushiwen.cn','gushiwen.org']start_urls = ['https://www.gushiwen.org/default_1.aspx']def parse(self, response):gsw_divs = response.xpath('//div[@class="left"]/div[@class="sons"]')for gsw_div in gsw_divs:title = gsw_div.xpath('.//b/text()').get()  #获取标题# 获取作者和朝代source = gsw_div.xpath('.//p[@class="source"]/a/text()').extract()try:author = source[0]dynasty = source[1]# 获取内容content_lst = gsw_div.xpath('.//div[@class="contson"]//text()').extract()content = ''.join(content_lst).strip()# 方式一# item = GsspiderItem()# item['title'] = title# item['content'] = content# 方式二item = GsspiderItem(title=title, author=author, dynasty=dynasty, content=content)yield itemexcept:print('source中有空列表')#翻页             next_href = response.xpath('//a[@id="amore"]/@href').get()if next_href:next_url = response.urljoin(next_href)print(next_href)yield scrapy.Request(next_url)

运行后得到gs.txt文件如下:
在这里插入图片描述
和网页总共的数量40首一致,没有问题。

小结:
1 如何处理 列表为空的数据 :
(1)可以做非空判断 例如豆瓣
(2)可以通过 try语句进行处理

2 翻页处理
(1) 可以找页数的规律
(2)直接找下一页的Url地址 然后 yield scrapy.Request(next_url)

3 遇到Url不全的时候 建议还是补全
(1)拼串
(2)urljoin() 这个是scrapy提供的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_851028.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫笔记25补充:scrapy爬取古诗文网站(爬取原文和译文时,遇到‘展开阅读全文’的处理)

如图: kenne 我们点击查看网页原代码,发现隐藏的数据并不在原代码中, 我们点击检查-network-再点击展开阅读全文 在又加载出来的数据中,找到下图椭圆框中的Response,发现这里有完整的译文及注释。由此我打开其Headers中的url&am…

微信开放平台---网站应用开发---微信登录功能 简介

1 微信开放平台:https://open.weixin.qq.com/ 2 开通流程: 3 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?actiondir_list&tresource/res_list&verify1&idopen1419316505&token&langzh_CN 4 效果展示…

抓取某一个网站整站的记录 【记录】

经常由于某些原因我们需要爬取某一个网站或者直接复制某一个站点,到网上找了很多工具进行测试,试了很多各有各的问题,最终选择了Teleport Ultra,用起来效果很好;具体的操作手册等东西就不在这里说了,网上搜…

谈谈个人网站的建立(三)—— 定时任务

欢迎访问我的网站http://www.wenzhihuai.com/ 。谢谢啊,如果可以,希望能在GitHub上给个star,GitHub地址https://github.com/Zephery/newblog 。 Quartz 先看一下Quartz的架构图:一.特点: 强大的调度功能,例…

同步、异步方式对SEO搜索引擎优化的影响

本人昨天去面试了,面试官问了这样一个问题“你知道SEO不?同步、异步对SEO有什么影响?”,我当时就懵了,这几个名词SEO、同步、异步我都知道,但是。SEO和同步异步有什么关系呢?面试官人很nice&…

记录使用scrapy爬取新闻网站最新新闻存入MySQL数据库,每天定时爬取自动更新

爬取每天更新的新闻,使用scrapy框架,Python2.7,存入MySQL数据库,将每次的爬虫日志和爬取过程中的bug信息存为log文件下。定义bat批处理文件,添加到计划任务程序中,自动爬取。 额… 1.在items文件中&#x…

6个线上视频音频转换网站

1.Zamzar Zamzar是一项免费的线上转换格式网站,把歌曲、图档、影像和文件转变成不同的格式。其服务特点是高品质的文件格式转换。基本的免费服务,可以让您转换的文件大小为100MB 。如果想拥有更多功能的服务,你可以注册成为基础会员&#xff…

四年大学下那些让我欲罢不能的网站

在本科学习期间,通过Google/百度搜索接触了各种各样的学习网站,收益匪浅,现在来分享一下吧 分为三种类型,“课程网站”,“编程网站”,“社区网站”,贵精不贵多,每种分享几个 课程网站…

Github Pages + jekyll 全面介绍极简搭建个人网站和博客

本文将会全面介绍一下如何使用Github Pages jekyll搭建个人站点,所谓极简的意思就是不用使用git和本地构建jekll服务,直接在Github网站上编辑设置即可,但会涉及到jekll的一些配置和编程控制。可以参看我的网站模板:https://scott…

css可以对网页干什么,css对网页的优势-专业SEO技术教程(33)

css对网页的优势-专业SEO技术教程(33)采用css布局相对于传统的table网页布局的显著优势1.表现和内容相分离将设计部分剥离出来的放在一个独立样式文件中,HTML文件中只存放文本信息。这样的页面对搜索引擎更加友好。2.提高页面浏览速度对于同一个页面视觉效果&#x…

【转载】IIS网站如何同时解析带www和不带www的域名

针对公网上线的网站系统,很多网站的域名会同时含有带www和不带www的域名解析记录,如果需要同时解析带www和不带www的域名信息,则需要在相应的域名解析平台(如阿里云域名解析平台、腾讯云域名解析平台)设置不带www的主域名以及带www的域名解析…

搜索引擎优化:常用的SEO六个指标

在做网站推广过程中,搜索引擎优化是一个重要点,绝大部分行业来自自然搜索的流量都是非常大的,正因为如此,一般企业隔一段时间就对网站自然搜索的情况作一个KPI考核,而这些重点指标不外乎:网页的收录数量、网…

阿里云上发布自己的网站的方法

在阿里云上发布自己的网站的方法: 一、在阿里云上发布自己的网站的方法: 进入我的电脑,在头部输入ftp://60.205.48.122(IP地址为自己注册的阿里云账号上的IP地址) 进入以后登录自己的账号 用户名&#x…

java使用HttpURLConnection检索网站时403错误处理方式

java使用HttpURLConnection检索网站时403错误处理方式: 我们通过代码方式访问网站时会报错: 此种情况分2中类型, 1.需要登录才可以访问; 2.需要设置User-Agent来欺骗服务器。 connection.setRequestProperty("User-Agent", &qu…

解决某些网站,图片不能下载

如下图,右键图片,没有保存图片的选项 按下F12 拷贝src中的地址,输入到浏览器,这时候就可以保存图片了

给duckling网站加上cnzz网站统计信息

第一,注册cnzz帐号,网址http://www.cnzz.com/ 第二,登录帐号,获取代码; 第三,根据自己的需要,将代码加入网站的公共页面,比如说head、foot、version页面都可以。 第四&#xff0c…

网站压力测试工具Jmeter安装与使用

系统是Windows XP 配置此工具前,需要先在机器上安装jdk 如下是在jdk1.7的基础上配置的; 安装步骤如下: 第一步:解压apache-jmeter-2.8.zip文件至c盘,本文解压至C:\jmeter2.8目录下。 第二步:桌面上选择“我…

十大抢手的网站压力测试工具

原文链接:http://blog.163.com/weiwenjuan_bj/blog/static/1403503362010621111052355/ 两天,jnj在本站发布了《如何在低速率网络中测试 Web 应用》,那是测试网络不好的情况。而下面是十个免费的可以用来进行Web的负载/压力测试的工具&#x…

使用WinSCP 上传 jeecms 到linux centos中 显示乱码问题,网站无法使用的解决方法

第一、设置WinSCP上传时的编码为utf-8如下: 第二、将linux的默认字符集设置为zh_CN.UTF-8 vi /etc/sysconfig/i18n 内容如下: LANG"zh_CN.UTF-8" SUPPORTED"zh_CN.UTF-8:zh_CN:zh" SYSFONT"latarcyrheb-sun16" [rootcan…

如何使用firefox浏览器查看记住的网站密码

工具——》选项——》安全 如下图: 点击就出现浏览器记住的登录网站、帐号、密码了,密码是明码。