6-爬虫-scrapy解析数据(使用css选择器解析数据、xpath 解析数据)、 配置文件

1 scrapy解析数据
1.1 使用css选择器解析数据
1.2 xpath 解析数据

2 配置文件
3 整站爬取博客–》爬取详情–》数据传递

scrapy 爬虫框架补充

# 1 打码平台---》破解验证码-数字字母:ddddocr-计算题,滑块,成语。。。-云打码,超级鹰:demo---》request携带图片发送请求# 2 通过打码平台登录打码平台-浏览器 缩放调100%-mac: 坐标都乘以2# 3 自动登录(京东,12306)---》扫码登录---》拿到二维码---》在本地把二维码弹出来,让用户扫码,可能有很多手机---》每个手机扫一遍---》登录很多账号---》存到cookie池中---》给其他程序用# 4 12306抢票-没有任何第三方 是官方授权的抢票---》第三方全是爬虫-高铁管家(只有一个好用---跨站搜索)-登录---》输入你的用户名和密码--1 加载了12306网页  2 用户名密码输入)---》拿到你的cookie-cookie池(2000条cookie)-有些登录才能访问的接口:随机从cookie拿一条cookie-候补补票# 4 selenium 爬取京东商品信息-需要登录
# 5 scrapy 爬虫框架
# 6 架构引擎爬虫调度器下载器存储pipline# 命令scrapy startproject 项目名scrapy genspider 爬虫名 爬取地址scrapy crawl 爬虫# 目录结构

在这里插入图片描述

1 scrapy解析数据

##### 运行爬虫
scrapy crawl cnblogs##### 可以项目目录下写个main.py
from scrapy.cmdline import execute
execute(['scrapy','crawl','cnblogs','--nolog'])#### 重点
1 response对象有css方法和xpath方法-css中写css选择器     response.css('')-xpath中写xpath选择   response.xpath('')
2 重点1-xpath取文本内容'.//a[contains(@class,"link-title")]/text()'-xpath取属性'.//a[contains(@class,"link-title")]/@href'-css取文本'a.link-title::text'-css取属性'img.image-scale::attr(src)'
3 重点2.extract_first()  取一个.extract()        取所有

1.1 使用css选择器解析数据

       def parse(self, response):article_list = response.css('article.post-item')# print(type(article_list))  # <class 'scrapy.selector.unified.SelectorList'>for article in article_list:title = article.css('a.post-item-title::text').extract_first()# print(name)author = article.css('a.post-item-author>span::text').extract_first()# print(author)url = article.css('a.post-item-title::attr(href)').extract_first()img = article.css('img.avatar::attr(src)').extract_first()desc = article.css('p.post-item-summary::text').extract()  # 文本内容可能放在第二个位置desc_content = desc[0].replace('\n', '').replace(' ', '')if not desc_content:desc_content = desc[1].replace('\n', '').replace(' ', '')print(f"""文章标题:{title}文章作者:{author}链接地址:{url}图片:{img}文章摘要:{desc_content}""")

1.2 xpath 解析数据

    def parse(self, response):article_list = response.xpath('//article[@class="post-item"]')for article in article_list:name = article.xpath('.//a[@class="post-item-title"]/text()').extract_first()# name = article.xpath('./section/div/a/text()').extract_first()author = article.xpath('.//a[@class="post-item-author"]/span/text()').extract_first()url = article.xpath('.//a[@class="post-item-title"]/@href').extract_first()img = article.xpath('./section/div/p/a/img/@src').extract_first()desc = article.xpath('./section/div/p/text()').extract()  # 文本内容可能放在第二个位置desc_content = desc[0].replace('\n', '').replace(' ', '')if not desc_content:desc_content = desc[1].replace('\n', '').replace(' ', '')print('''文章标题:%s文章作者:%s文章地址:%s头像:%s摘要:%s''' % (name, author, url, img, desc_content))

2 配置文件

#### 基础配置
# 项目名
BOT_NAME = "scrapy_demo"
# 爬虫所在路径
SPIDER_MODULES = ["scrapy_demo.spiders"]
NEWSPIDER_MODULE = "scrapy_demo.spiders"# 记住  日志级别
LOG_LEVEL='ERROR'# 请求头中的  USER_AGENT
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"# 是否遵循爬虫协议
ROBOTSTXT_OBEY = False# 默认请求头
#DEFAULT_REQUEST_HEADERS = {
#    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
#    "Accept-Language": "en",
#}#爬虫中间件
#SPIDER_MIDDLEWARES = {
#    "scrapy_demo.middlewares.ScrapyDemoSpiderMiddleware": 543,
#}# 下载中间件
#DOWNLOADER_MIDDLEWARES = {
#    "scrapy_demo.middlewares.ScrapyDemoDownloaderMiddleware": 543,
#}# 持久化相关
#ITEM_PIPELINES = {
#    "scrapy_demo.pipelines.ScrapyDemoPipeline": 300,
#}### 高级配置(提高爬取效率)
#1 增加并发:默认16
默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改
CONCURRENT_REQUESTS = 100
值为100,并发设置成了为100#2 提高日志级别:
在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:
LOG_LEVEL = 'INFO'# 3 禁止cookie:
如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:
COOKIES_ENABLED = False# 4 禁止重试:
对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:
RETRY_ENABLED = False# 5 减少下载超时:
如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:
DOWNLOAD_TIMEOUT = 10 超时时间为10s

3 整站爬取cnblogs–》爬取详情–》数据传递

# 整站爬取:爬取所有页-解析出下一页 yield Request(url=next, callback=self.parse)爬取文章详情-解析出详情地址:yield Request(url=url, callback=self.detail_parser)多个Request之间数据传递yield Request(url=url,meta={'item':item})在解析的 response中 response.meta.get('item')
    def parse(self, response):article_list = response.xpath('//article[@class="post-item"]')for article in article_list:name = article.xpath('.//a[@class="post-item-title"]/text()').extract_first()# name = article.xpath('./section/div/a/text()').extract_first()author = article.xpath('.//a[@class="post-item-author"]/span/text()').extract_first()url = article.xpath('.//a[@class="post-item-title"]/@href').extract_first()img = article.xpath('./section/div/p/a/img/@src').extract_first()desc = article.xpath('./section/div/p/text()').extract()  # 文本内容可能放在第二个位置desc_content = desc[0].replace('\n', '').replace(' ', '')if not desc_content:desc_content = desc[1].replace('\n', '').replace(' ', '')# print('''# 文章标题:%s# 文章作者:%s# 文章地址:%s# 头像:%s# 摘要:%s# ''' % (name, author, url, img, desc_content))# 详情地址:url ----》想继续爬取详情item={'name':name,'url':url,'img':img,'text':None}yield Request(url=url, callback=self.detail_parser,meta={'item':item})#### 继续爬取下一页# next='https://www.cnblogs.com'+response.css('div.pager>a:last-child::attr(href)').extract_first()next = 'https://www.cnblogs.com' + response.xpath('//div[@class="pager"]/a[last()]/@href').extract_first()print(next)yield Request(url=next, callback=self.parse)# 逻辑---》起始地址:https://www.cnblogs.com---》回到了parse---》自己解析了(打印数据,继续爬取的地址)---》yield Request对象---》第二页---》爬完后又回到parser解析def detail_parser(self, response):print(len(response.text))item=response.meta.get('item')text=response.css('#cnblogs_post_body').extract_first()item['text']=text# 我们想把:上一个请求解析出来的  标题,摘要,图片 和这个请求解析出来的 文本合并到一起# 这个text 无法和 上面 parse解析出的文章标题对应上print(item)

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

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

相关文章

AI:69-基于深度学习的音乐推荐

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

索引和事务

文章目录 一、索引1.1 概念1.2 作用1.3 使用场景1.4 使用 二、事务2.1 为什么要使用事务2.2 事务的概念2.3 事务的使用 三、内容重点总结 一、索引 1.1 概念 索引是一种特殊的文件&#xff0c;包含对数据表所有记录的引用指针。在MySQL中&#xff0c;索引是基于一个或多个列的…

【紫光同创国产FPGA教程】——PDS安装教程

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 一&#xff1a;软件简介 PangoDesign Suite是紫光同创基于多年FPGA开发软件技术攻关与工程实践经验而研发的一款拥有国产自主知识产权的大规模FPGA开…

Redis系列-Redis过期策略以及内存淘汰机制【6】

目录 Redis系列-Redis过期策略以及内存淘汰机制【6】redis过期策略内存淘汰机制算法LRU算法LFU 其他场景对过期key的处理FAQ为什么不用定时删除策略? Ref 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; Redis系列-Redis过期策略以及内存淘…

18 CDN详解

1、理解CDN 1.CDN 和电商系统的分布式仓储系统一样&#xff0c;就近发货给客户(客户端)&#xff0c;所以&#xff0c;必然是提前在仓库中存储了某些商品. 2.CDN最擅长的是缓存静态数据&#xff0c;比如电商系统的热点静态页面&#xff0c;秒杀场景的页面等.问题&#xff1a;向…

快手快速涨粉的方法,自动涨粉软件的开发分享与实操分享

先来看视频实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 随着互联网的飞速发展&#xff0c;快手已经成为了许多人分享生活、展示才艺的平台。在快手上&#xff0c;如果你想要快速涨粉&#xff0c;就需要掌握一些技巧和方法…

计算机网络实验

计算机网络实验 使用软件PT7.0按照上面的拓扑结构建立网络&#xff0c;进行合理配置&#xff0c;使得所有计算机之间能够互相通信。并且修改各交换机的系统名称为&#xff1a;学号_编号&#xff0c;如你的学号为123&#xff0c;交换机Switch0的编号为0&#xff0c;则系统名称为…

前端Vue 页面滑动监听 拿到滑动的坐标值

前言 前端Vue 页面滑动监听 拿到滑动的坐标值 实现 Vue2写法 mounted() {// 监听页面滚动事件window.addEventListener("scroll", this.scrolling);}, methods: { scrolling() {// 滚动条距文档顶部的距离let scrollTop window.pageYOffset ||document.documentE…

如何使用Node.js快速创建HTTP服务器并实现公网访问本地Server

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

Redis系列-Redis数据类型【3】

目录 Redis系列-Redis数据类型【3】字符串类型&#xff08;String&#xff09;SDS (simple dynamic string) 哈希类型&#xff08;Hash&#xff09;列表类型&#xff08;List&#xff09;集合类型&#xff08;Set&#xff09;有序集合类型&#xff08;ZSet&#xff09;字符串类…

【JavaEE】HTTP协议(什么是HTTP?、HTTP格式、form表单和ajax构造HTTP)

一、什么是HTTP协议&#xff1f; 1.1 HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议 1.2 理解HTTP协议的工作过程 当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就…

es6过滤对象里面指定的不要的值filter过滤

//过滤出需要的值this.dataItemTypeSelectOption response.data.filter(ele > ele.dictValue tree||ele.dictValue float4);//过滤不需要的值this.dataItemTypeSelectOption response.data.filter((item) > {return item.dictValue ! "float4"&&it…

基于站点、模式、遥感多源降水数据融合实践技术应用

降水在水循环中发挥着重要作用&#xff0c;塑造了生态景观和生态系统。目前&#xff0c;有四种主要方式获取降水数据&#xff1a;1&#xff09;雨量计观测&#xff0c;2&#xff09;地基雷达遥感&#xff0c;3&#xff09;卫星遥感&#xff0c;4&#xff09;模式模拟。基于雨量…

K8s----资源管理

目录 一、Secret 1、创建 Secret 1.1 用kubectl create secret命令创建Secret 1.2 内容用 base64 编码&#xff0c;创建Secret 2、使用方式 2.1 将 Secret 挂载到 Volume 中&#xff0c;以 Volume 的形式挂载到 Pod 的某个目录下 2.2 将 Secret 导出到环境变量中 二、Co…

LeetCode_多源 BFS_中等_2258.逃离火灾

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个下标从 0 开始大小为 m x n 的二维整数数组 grid &#xff0c;它表示一个网格图。每个格子为下面 3 个值之一&#xff1a; 0 表示草地。1 表示着火的格子。2 表示一座墙&#xff0c;你跟火都不能通过…

你别说,还真好用,Apipost-IDEA插件

写完代码还得重复打字编写接口文档&#xff1f;代码量大定位接口定义方法太难找&#xff1f;麻烦&#xff01;写完代码还得复制粘贴到postman进行调试&#xff1f; 这三点太麻烦&#xff1f;今天给大家推荐一款IDEA插件&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;…

工业物联网模块应用之砂芯库桁架机器人远程无线控制

一、应用背景 在铸管车间无线技改项目中&#xff0c;客户需要构建智能化砂芯库&#xff0c;要求各库存的规格、数量、位置坐标等数据实时可显。此外&#xff0c;还需具备自动入库及出库功能&#xff0c;用于将出炉后的成摞砂芯及时码放至砂芯库的预设位置&#xff0c;当离心机…

深度学习(CNN+RNN)笔记2

文章目录 第五课&#xff1a;序列模型(Sequence Models)第一周&#xff1a;循环神经网络&#xff08;Recurrent Neural Networks&#xff09;【序列模型、语言模型序列生成、对新序列采样。RNN、GRU、LSTM、双向RNN、深度RNN】第二周&#xff1a;自然语言处理与词嵌入&#xff…

管理视频推广工作:新媒体团队的成功策略

目前的新媒体团队&#xff0c;在视频管理时呈现出多、杂、散的特点&#xff0c;如何有效管理视频素材是当下许多新媒体团队的管理痛点&#xff0c;也是管理要点。高效的视频推广管理是新媒体团队提升产出效率的关键。 那么新媒体行业该如何管理视频推广工作&#xff1f; 数据…

Spring-循环依赖简述

什么是循环依赖 // A依赖了B class A {public B b; } ​ // B依赖了A class B {public A a; } ​ // 循环依赖 A a new A(); B b new B(); a.b b; b.a a; 对象之间的相互依赖很正常&#xff0c;但是在Spring中由于对象创建要经过Bean的生命周期&#xff0c;所以就有了循环…