scrapy爬取汽车、车评数据【上】

news/2024/12/21 22:51:08/

这个爬虫我想分三期来写:
✅ 第一期写如何爬取汽车的车型信息;
✅ 第二期写如何爬取汽车的车评;
✅ 第三期写如何对车评嵌入情感分析结果,以及用简单的方法把数据插入mysql中;
技术基于scrapy框架、BERT语言模型、mysql数据库。

1 新建工程

scrapy的老三样,可以用命令创建工程

scrapy startproject car_spider

进入目录,创建爬虫

cd car_spider
scrapy genspider car dongchedi.com

这样scrapy就自动搭好了看框架,然后用开发工具打开就行了。

2 分页爬取车型

我们的爬取思路是先根据车型接口获取到所有的车型,然后根据汽车的详情接口去获取汽车详情数据。
获取车型的接口是post请求,带有分页参数的,所以可以这么处理:

class CarSpider(scrapy.Spider):name = 'car'allowed_domains = ['dongchedi.com']start_url = 'https://www.dongchedi.com/motor/pc/car/brand/select_series_v2?aid=1839&app_name=auto_web_pc'custom_settings = {'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'}def __init__(self, *args, **kwargs):super(CarSpider, self).__init__(*args, **kwargs)self.item_count = 0  # 初始化计数器self.limit = 20  # 每页数据量self.current_page = 1  # 当前页码def start_requests(self):"""首次发送 POST 请求"""formdata = {'page': str(self.current_page),'limit': str(self.limit),}yield scrapy.FormRequest(url=self.start_url,formdata=formdata,callback=self.parse)def parse(self, response):"""解析分页数据并提取信息"""data = json.loads(response.body)series_list = data['data']['series']series_count = data['data']['series_count']  # 总数据量total_pages = (series_count // self.limit) + 1  # 计算总页数# 处理当前页的数据for car in series_list:car_id = car['concern_id']detail_url = f'https://www.dongchedi.com/motor/car_page/m/v1/series_all_json/?series_id={car_id}&city_name=武汉&show_city_price=1&m_station_dealer_price_v=1'yield scrapy.Request(url=detail_url, callback=self.parse_detail)# 如果还有下一页,继续发送请求if self.current_page < total_pages:self.current_page += 1formdata = {'page': str(self.current_page),'limit': str(self.limit),}yield scrapy.FormRequest(url=self.start_url,formdata=formdata,callback=self.parse)

3 爬取车型详细信息

获取到car[‘concern_id’]之后,就根据这个利用parse_detail去处理详情信息,获取到之后传给Item、pipeline

 def parse_detail(self, response):"""解析汽车详细信息"""data = json.loads(response.body)series_all = data.get('data', {})cover_img = series_all.get('cover_url')brand_name = series_all.get('brand_name')series_id = series_all.get('series_id')online_models = series_all.get('online', [])for model in online_models:model_info = model['info']try:series_name = model_info['name']car_name = model_info['series_name']price_info = model_info['price_info']dealer_price = price_info.get('official_price', 'N/A')car_id = model_info.get('car_id')owner_price_summary = model_info.get('owner_price_summary', {})naked_price_avg = owner_price_summary.get('naked_price_avg', 'N/A')# 创建Item实例item = DongchediItem()item['name'] = f"{car_name}-{series_name}"item['dealer_price'] = dealer_priceitem['naked_price_avg'] = naked_price_avgitem['brand_name'] = brand_nameitem['cover_img'] = cover_imgitem['series_id'] = series_iditem['car_id'] = car_idself.item_count += 1  # 增加计数器# 返回item,保存到数据库或文件yield item

4 爬取结束给出统计信息

爬虫结束后给出统计信息,看看爬取了多少个数据,这里用紫色的字体:

    def closed(self, reason):"""爬虫结束时调用"""purple_text = f"\033[95m总共爬取了 {self.item_count} 个 item\033[0m"self.logger.info(purple_text)

5 items 和 pipeline

实际上这个接口可以获取非常多的信息,这边写的比较简单,pipeline的处理也省略了,就进行一个打印:
items


class DongchediItem(scrapy.Item):name = scrapy.Field()dealer_price = scrapy.Field()naked_price_avg = scrapy.Field()brand_name = scrapy.Field()cover_img = scrapy.Field()series_id = scrapy.Field()car_id = scrapy.Field()

pipelines,注意在settings.py里激活一下

class DongchediPipeline:def process_item(self, item, spider):# 可以添加保存数据库或文件的逻辑print(item)return item

5 运行结果

运行一圈,发现爬取到了12565个车的数据。
在这里插入图片描述


http://www.ppmy.cn/news/1534148.html

相关文章

C--编译和链接见解

欢迎各位看官&#xff01;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论 感谢各位看官的支持&#xff01;&#xff01;&#xff01; 一&#xff1a;翻译环境和运行环境 在ANSIIC的任何一种实现中&#xff0c;存在两个不同的环境1&#xff0c;…

Unity3D 房间去重叠化算法详解

前言 在Unity3D游戏开发中&#xff0c;经常需要生成和处理多个房间的场景&#xff0c;特别是在地牢生成、房屋布局或迷宫设计等应用中。为了确保生成的房间不会重叠&#xff0c;我们需要一种有效的去重叠化算法。以下将详细介绍该算法的原理和代码实现。 对惹&#xff0c;这里有…

kubernetes笔记(一)

kubernetes安装&#xff1a; 主机清单 主机名IP地址最低配置master192.168.1.502CPU,4G内存node-0001192.168.1.512CPU,4G内存node-0002192.168.1.522CPU,4G内存node-0003192.168.1.532CPU,4G内存node-0004192.168.1.542CPU,4G内存node-0005192.168.1.552CPU,4G内存harbor192…

828华为云征文|华为云 Flexus X 实例初体验

一直想有自己的一款的服务器&#xff0c;为了更好的进行家庭娱乐&#xff0c;甚至偶尔可以满足个人搭建开发环境的需求&#xff0c;直到接触到了华为云 Flexus X 云服务器。Flexus 云服务器 X 实例是面向中小企业和开发者打造的轻量级云服务器。提供快速应用部署和简易的管理能…

以太网交换安全:MAC地址表安全

一、MAC地址表安全 MAC地址表安全是网络安全中的一个重要方面&#xff0c;它涉及到网络设备的MAC地址表的管理和保护。以下是对MAC地址表安全的详细介绍&#xff1a; &#xff08;1&#xff09;基本概念 定义&#xff1a;MAC地址表是网络设备&#xff08;如交换机&#xff0…

electron出现乱码和使用cmd出现乱码

第一种出现乱码。这种可以通过chcp 65001&#xff0c;设置为utf-8的编码。第二种&#xff0c;是执行exec的时候出现乱码&#xff0c;这个时候需要设置一些编码格式&#xff0c;可以通过iconv-lite进行解决&#xff0c;这个方法是node自带的&#xff0c;所以不需要导入。使用方法…

人工智能价格战——如何降低成本让人工智能更易于普及

十年前&#xff0c;开发人工智能 (AI) 是只有大公司和资金充足的研究机构才能负担得起的事情。必要的硬件、软件和数据存储成本非常高。但从那时起&#xff0c;情况发生了很大变化。一切始于 2012 年的 AlexNet&#xff0c;这是一种深度学习模型&#xff0c;展示了神经网络的真…

主流前端框架实际案例说明

为了更深入地理解不同前端框架的特点和适用场景&#xff0c;以下将通过几个具体案例分析&#xff0c;探讨在实际项目中选择框架的决策过程。 案例一&#xff1a;电商平台开发 项目背景 一个新兴电商平台希望快速上线&#xff0c;提供良好的用户体验和性能&#xff0c;同时需…