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)

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

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

相关文章

网络流量分类概述

1. 什么是网络流量&#xff1f; 一条网络流量是指在一段特定的时间间隔之内&#xff0c;通过网络中某一个观测点的所有具有相同五元组(源IP地址、目的IP地址、传输层协议、源端口和目的端口)的分组的集合。 比如(10.134.113.77&#xff0c;47.98.43.47&#xff0c;TLSv1.2&…

金豺算法优化VMD参数,六种适应度函数任意切换,最小包络熵、样本熵、信息熵、排列熵、排列熵/互信息熵、包络谱峰值因子...

声明&#xff1a;对于作者的原创代码&#xff0c;禁止转售倒卖&#xff0c;违者必究&#xff01; 本期采用金豺优化算法(Golden Jackal optimization, GJO)优化VMD参数。选取六种适应度函数进行优化&#xff0c;以此确定VMD的最佳k和α参数。6种适应度函数分别是&#xff1a;最…

TSINGSEE视频智能分析系统AI算法针对遛狗不拴绳行为的监管方案

一、背景与需求 近期&#xff0c;一则恶犬咬伤女童的新闻上了热搜&#xff0c;因为狗主人没有给狗拴绳&#xff0c;导致小区内一女童被大型犬撕咬&#xff0c;女童全身多处咬伤&#xff0c;已入院治疗。该新闻曝出后立刻引发社会关注。遛狗不拴绳行为也再一次引发热议。因为狗主…

【Leetcode】202. 两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

Flink -- 状态与容错

1、Stateful Operations 有状态算子&#xff1a; 有状态计算&#xff0c;使用到前面的数据&#xff0c;常见的有状态的算子&#xff1a;例如sum、reduce&#xff0c;因为它们在计算的时候都是用到了前面的计算的结果 总结来说&#xff0c;有状态计算并不是独立存在的&#xf…

以吉祥物宣传片实力出圈!吉祥物三维动画宣传片怎么制作?

首届学青会吉祥物“壮壮”、“美美”在宣传片中展示了举重、打羽毛球、游泳等运动姿态&#xff0c;靠着可爱的虚拟形象萌出圈&#xff01; *图片源于网络 在数字化时代&#xff0c;吉祥物三维动画宣传片已成为众多大型活动、品牌宣发、文旅城市宣传的一大途径&#xff0c;如学…

Vue 传参踩坑之旅——事件总线与 props

Vue 传参踩坑之旅——事件总线与 props 缘由 今天突然发现项目出现了一个 bug&#xff0c;这里简单描述一下。 这里有 A、B、C、D 四个组件&#xff0c;关系为 A - 祖先、B - 父、C - 子、D - 叔&#xff08;实际业务组件关系复杂很多&#xff09;。 A - 祖先 B - 父 C - 子…

飞桨平台搭建PP-YOLOE模型

一、创建项目 此博客仅是运行PP-YOLOE源码&#xff0c;这里以变压器渗漏数据集为例COCO数据集太大了&#xff0c;跑不动&#xff0c;V100训练预估计得7天左右&#xff0c;即便是A100也得4天半&#xff0c;变压器渗漏油数据集跑一个小时左右&#xff0c;还可以接受&#xff0c;…

认识计算机-JavaEE初阶

文章目录 一、计算机的发展史二、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09;三、CPU基本工作流程3.1 算术逻辑单元&#xff08;ALU&#xff09;3.2 寄存器&#xff08;Register)和内存&#xff08;RAM&#xff09;3.3 控制单元&#xff08;CU&#xff09;3…

时序预测 | MATLAB实现WOA-CNN-BiLSTM-Attention时间序列预测(SE注意力机制)

时序预测 | MATLAB实现WOA-CNN-BiLSTM-Attention时间序列预测&#xff08;SE注意力机制&#xff09; 目录 时序预测 | MATLAB实现WOA-CNN-BiLSTM-Attention时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述 1.MAT…

深入了解Typescript中type和interface具体区别?

前言 新手刚开始学习 TypeScript 时&#xff0c;往往会对 type 和 interface 的使用场景和方式感到困惑。因此&#xff0c;本文旨在总结 type 和 interface 的概念和用法。 一、概念 type&#xff1a;类型别名 概念&#xff1a;允许为一个或多个数据类型&#xff08;例如 str…

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

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

zookeeper:服务器有几种状态?

四种&#xff1a; looking(选举中&#xff09;、leading(leader)、following( follower)、 observer(观察者角色&#xff09;

挑战100天 AI In LeetCode Day06(热题+面试经典150题)

挑战100天 AI In LeetCode Day06&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-82.1 题目2.2 题解 三、面试经典 150 题-83.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&am…

直面LED Driver测试挑战,助力显示屏行业变中求变!

杭州亚运会开幕式惊艳世界&#xff0c;引发社会各界一致赞誉&#xff01;在大气浪漫的舞台效果中&#xff0c;LED屏、裸眼3D屏凭借“硬核科技”出圈&#xff0c;为大家带来科技、活力、诗意的“中国式浪漫”观赏体验。而这美轮美奂的LED呈现效果背后&#xff0c;主要依靠的是LE…

Spring Cloud LoadBalancer 负载均衡策略与缓存机制

目录 1. 什么是 LoadBalancer &#xff1f; 2. 负载均衡策略的分类 2.1 常见的负载均衡策略 3. 为什么要学习 Spring Cloud Balancer &#xff1f; 4. Spring Cloud LoadBalancer 内置的两种负载均衡策略 4.1 轮询负载均衡策略&#xff08;默认的&#xff09; 4.2 随机负…

实用篇-Git

一、Git初识 git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件(Java类、xml文件&#xff0c;html文件页面等)&#xff0c;通过git仓库来对这些文件进行存储和管理 git仓库分为 本地仓库&#xff1a;开发人员自己电脑上的git仓库 远程仓库&#…

野火霸天虎 STM32F407 学习笔记_4 构建库函数尝试;使用固件库点亮 LED 灯

构建库函数 创建一个通用的模板&#xff0c;后面写程序直接使用这个模板。 $ ls Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2023/11/8 23:27 Libraries d----- …

grafana 密码忘记怎么重置

1.重置密码的命令&#xff1a; grafana-cli admin reset-admin-password 新的密码

【miniconda+jupyter环境安装】

minicondajupyter环境安装 下载miniconda创建第二个环境修改jupyternotebook的默认路径配置下源&#xff0c;下载快一点安装数据科学常用包先写到这儿&#xff01;拜拜~ 下载miniconda 网址&#xff1a;https://docs.conda.io/en/latest/miniconda.html 运行下载安装&#xff…