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;则系统名称为…

我的MQTT操作类(M2Mqtt.Net)

类本体 4.3.0 public class MQTTMain{public MqttClient mqttClient null ; public bool MQTTMainConnect(string MenZuNo, string ServerIP, int ServerPort, string UserName, string Pwd){try{string EMQX_CLIENT_ID $"称重端-{MenZuNo}-{OPCommon.PCControl.G…

http 403

一、什么是HTTP ERROR 403 403 Forbidden 是HTTP协议中的一个状态码(Status Code)。可以简单的理解为没有权限访问此站&#xff0c;服务器受到请求但拒绝提供服务。 二、HTTP 403 状态码解释大全 403.1 -执行访问禁止。 403.2 -读访问禁止。 403.3 -写访问禁止。 403.4要…

gdb调试常用命令

基本命令 1&#xff09;进入GDB  #gdb test test是要调试的程序&#xff0c;由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。 2&#xff09;查看源码  (gdb) l 源码会进行行号提示。 如果需要查看在其他文件中定义的函数&#xff0c;在l后加上函数名即可定位到这…

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

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

vue、react数据绑定的区别?

Vue 和 React 是两个流行的前端框架&#xff0c;它们在数据绑定方面有一些区别。 Vue 的数据绑定&#xff1a; Vue 使用双向数据绑定&#xff08;two-way data binding&#xff09;的概念。这意味着当数据发生变化时&#xff0c;视图会自动更新&#xff1b;同时&#xff0c;当…

如何使用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 请求. 对方服务器收到这个请求之后, 经过计算处理, 就…

单例设计模式

什么是单例&#xff1f; 单例就像我们的任务管理器窗口无论打开几次&#xff0c;桌面上只有一个窗口 所谓单例就是&#xff0c;我们有且只能创建一个对象 怎么实现呢 public class A{//定义一个类变量记住该类的一个对象private static A a new A();//私有构造器 ---这样只能通…

Flex bison 学习好代码

计算机的重要课程编译原理很难学吧&#xff0c; 但是要会用flex &bison的话&#xff0c;容易理解一些。 有些好的项目可以帮助我们&#xff0c;比如 https://github.com/jgarzik/sqlfun 可以帮我们&#xff0c;下载 下来。 在cygwin 下面或者linux 运行&#xff1a; …

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…

关于表单校验,:rules=“loginRules“

在写好validator相关的方法后&#xff0c;rule测试没有生效 <el-form ref"loginForm" :model"loginForm" :rules"loginRules" class"login-form" <el-form-item prop"username"> <el-input ref"usernam…

C#对图片Image转换为Bitmap并解析图片中的条码

首先&#xff0c;你需要安装ZXing.Net库。你可以通过NuGet包管理器来安装。 using ZXing; using ZXing.Common; using ZXing.QrCode; public class Test {public string DecodeBarcode(Bitmap bitmap) { var reader new BarcodeReader(); var result reader.Decode(b…