使用scrapy爬取蜻蜓FM

创建框架和项目

### 1. 创建虚拟环境
conda create -n spiderScrapy python=3.9 
### 2. 安装scrapy
pip install scrapy==2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple### 3. 生成一个框架并进入框架
scrapy startproject my_spider
cd my_spider### 4. 生成项目
scrapy genspider Qingting http://http://m.qingting.fm/rank/### 5. 重新安装Twisted指定版本
pip install Twisted==22.10.0### 6. 启动项目
scrapy crawl baidu

这里创建了一个qingting的爬虫项目

在这里插入图片描述

  • 启动框架后会自动调用parse方法

  • parse方法是scrapy框架的回调方法,当启动scrapy框架后:

    1. scrapy对start_urls类属性进行迭代并获取将要请求的地址
    2. 获取到地址后,scrapy会自动发送请求
    3. 获取到响应对象后会调用parse方法并将获取到的response对象传递过来
  • response对象中常用的属性

     print('响应url', response.url)print('响应头', response.headers)print('响应状态码', response.status)print('响应体', response.body.decode('utf-8'))print('请求地址', response.request.url)print('请求头', response.request.header)
    

后面开发过程使用cmdline进行启动

from scrapy import cmdline
...
...
...
if __name__ == '__main__':cmdline.execute("scrapy crawl qingting".split())

1. 在parse中解析response响应内容

在这里插入图片描述
2. 使用yield关键字将解析好的数据提交给管道pipelines模块进行存储
在这里插入图片描述

#qingting.py
class QingtingSpider(scrapy.Spider):name = "qingting"allowed_domains = ["m.qingting.fm", "pic.qtfm.cn"]  # 请求白名单start_urls = ["http://m.qingting.fm/rank/"]# 启动框架后会自动调用parse方法def parse(self, response: HtmlResponse, **kwargs):"""parse方法是scrapy框架的回调方法,当启动scrapy框架后:1. scrapy对start_urls类属性进行迭代并获取将要请求的地址2. 获取到地址后,scrapy会自动发送请求3. 获取到响应对象后会调用parse方法并将获取到的response对象传递过来""""""response对象中常用的属性print('响应url', response.url)print('响应头', response.headers)print('响应状态码', response.status)print('响应体', response.body.decode('utf-8'))print('请求地址', response.request.url)print('请求头', response.request.header)"""a_list = response.xpath('//div[@class="rank-list"]/a')for item in a_list:rank_num = item.xpath('./div[@class="badge"]/text()').extract_first()  # 排名title = item.xpath('.//div[@class="title"]/text()').extract_first()  # 标题img_url = item.xpath('./img/@src').extract_first()  # 图片地址desc = item.xpath('.//div[@class="desc"]/text()').extract_first()  # 描述play_number = item.xpath('.//div[@class="info-item"][1]/span/text()').extract_first()  # 播放数# 下一步:# 使用yield关键字将解析好的数据提交给管道pipelines模块进行存储yield {"type": "info","title": title,"img_url": img_url,"rank_num": rank_num,"desc": desc,"play_number": play_number}# 自行构造request请求并交给下载器下载"""callback: 指定解析方法cb_kwargs: 如果解析方法中存在形参,则可以通过cb_kwargs传递,传递值的类型必须是字典,字典中的key必须与形参名称保持一致"""print(img_url)yield scrapy.Request(img_url, callback=self.parse_img, cb_kwargs={'img_name': title})def parse_img(self, response, img_name):yield {'type': 'img','img_name': f"{img_name}.png",'img_content': response.body}
## pipelines.py
import os
import pymongo
class FmPipeline:def process_item(self, item, spider):"""如果想在管道模块中打印parse方法返回的数据需要在配置文件中激活管道:param item:  parse方法返回的值:param spider: 定义的爬虫名称:return:"""type_ = item.get('type')if type_ == "img":download_path = os.path.join(os.getcwd(), 'download')if not os.path.exists(download_path):os.mkdir(download_path)img_name = item.get('img_name')image_content = item.get('img_content')if img_name:with open(f"{download_path}/{img_name}".replace("|",'_'), 'wb') as file:file.write(image_content)print('图片保存成功', img_name)elif type_ == "info":mongo_client = pymongo.MongoClient('mongodb://root:123456@124.70.4.*:27017')  # 连接自己的数据库collection = mongo_client['py_spider']['fm']collection.insert_one(item)print('数据插入成功')else:print('其他未知的数据类型')
## 警告处理
2024-03-09 14:34:17 [py.warnings] WARNING: D:\software\miniconda3\envs\spiderScrapy\lib\site-packages\scrapy\selector\unified.py:83: UserWarning: Selector got both text and root, root is being ignored.super().__init__(text=text, type=st, root=root, **kwargs)## 降级parsel包
pip install parsel==1.7.0

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

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

相关文章

一个用libcurl多线程下载断言错误问题的排查

某数据下载程序,相同版本的代码,在64位系统中运行正常,但在32位系统中概率性出现断言错误。一旦出现,程序无法正常继续,即使重启亦不行。从年前会上领导提出要追到根,跟到底,到年后的今天&#…

数据标注专业团队

数据标注服务 在跟一些淘宝、多多商家老板合作后,客户一般付款后,中介是有20%左右的提成,我们主要是希望可以实现数据标注无中介化,有需求可以直接联系数据标注团队直接负责人, 若有意愿请添加添加v:shu_ju…

全网最最最详细-bash: wget: 未找到命令如何解决教程

在基于 Red Hat 的系统中,包管理器是 yum 或者在更新的版本中是 dnf。 如果你的系统是 CentOS 7 或更早版本,你应该使用 yum 命令来安装 wget: sudo yum install wget如果你的系统是 CentOS 8 或者 Fedora,你可能需要使用 dnf 命…

SPI读取TLE5012B编码器角度数据_ACM32G103

买到一个带编码器的电机,卖家留出来读取编码器数据的接口有SPI 具体的原理图如下: P2标注的是SPI的接口,其中MISO和MOSI是硬件连接到一起的 使用ACM32G103的硬件SPI2去读取其角度数据 原理大概如下: 1、先发送读取数据的指令&…

Java二叉树 (2)

🐵本篇文章将对二叉树的一些基础操作进行梳理和讲解 一、操作简述 int size(Node root); // 获取树中节点的个数int getLeafNodeCount(Node root); // 获取叶子节点的个数int getKLevelNodeCount(Node root,int k); // 获取第K层节点的个数int getHeight(Node r…

浅谈2024 年 AI 辅助研发趋势!

目录 ​编辑 引言 一、AI辅助研发现状 1. 技术发展 2. 工具集成 3. 应用场景 二、AI辅助研发趋势 1. 更高的自动化程度 2. 更高的智能化程度 3. 更多的领域应用 4. 更高的重视度 三、结论 四. 完结散花 悟已往之不谏,知来者犹可追 创作不易&#xff…

阿里云服务器多少钱一年?价格表新鲜出炉(2024)

2024阿里云服务器优惠活动政策整理,阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年,轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年,云服务器4核16G10M带宽26元1个月、149元半年,云服务器8核…

SpringCloudGateway理论与实践

文章目录 网关介绍为什么需要网关Gateway 使用gateway pom依赖yml 配置重启测试总结 断言过滤器工厂路由过滤器的种类请求头过滤器默认过滤器全局过滤器总结 Gateway解决跨域 网关介绍 Spring Cloud Gateway 是一个基于Spring Framework 5,由Spring Cloud团队开发的…

如何解决新版的anaconda notebook 打不开浏览器

1 安装nodejs 先安装nodejs,里面有很多需要用node来启动服务 2 一片空白 安装jupyter以后启动, 结果就得到了如下,在chrome里面打开以后,一片空白 3 列出环境 conda create --name pytorch python3.9 conda env list cond…

Kubernetes-4

文章目录 Kubernetes-41、pod的生命周期2、pod的中止过程3、强制终止pod4、查看资源类型4.1、kubectl get 后面接的都是资源类型4.2、kubectl api-resources 查看目前有哪些资源类型 5、容器的状态5.1、总结5.2、Pod 状态和 Pod 内部容器状态5.3、容器的重启策略 6、探针probe6…

C/C++指针详解

接下来我们来介绍一下什么是指针? 指针其实就是元素存放地址,更加形象的比喻:在酒店中如果你想要去注必须去付费不然不能住,在计算机也同样如此(但是不需要付费哦)每当我们使用一个变量或其他需要申请空间…

C/C++编程-理论学习-通信协议理论

通信协议理论 protobuf简述使用简介proto 文件为了nanopb 编译.proto文件修改生成器行为 streamsoutput streamsinput streams Data types(数据类型)Field callbacks(字段回调)Encoding callbacks(编码回调)Message descriptor(信息描述)三个关键字required、optional、repeate…