利用爬虫技术自动化采集汽车之家的车型参数数据

{亿牛云}.png

导语

汽车之家是一个专业的汽车网站,提供了丰富的汽车信息,包括车型参数、图片、视频、评测、报价等。如果我们想要获取这些信息,我们可以通过浏览器手动访问网站,或者利用爬虫技术自动化采集数据。本文将介绍如何使用Python编写一个简单的爬虫程序,实现对汽车之家的车型参数数据的自动化采集,并使用亿牛云爬虫代理服务来提高爬虫的稳定性和效率。

概述

爬虫技术是一种通过编程模拟浏览器访问网页,解析网页内容,提取所需数据的技术。爬虫程序通常需要完成以下几个步骤:

  • 发送HTTP请求,获取网页源代码
  • 解析网页源代码,提取所需数据
  • 存储或处理提取的数据

在实际的爬虫开发中,我们还需要考虑一些其他的问题,例如:

  • 如何避免被网站反爬机制识别和封禁
  • 如何提高爬虫的速度和效率
  • 如何处理异常和错误

为了解决这些问题,我们可以使用一些工具和服务来辅助我们的爬虫开发,例如:

  • 使用requests库来发送HTTP请求,简化网络编程
  • 使用BeautifulSoup库或者XPath语法来解析网页源代码,方便数据提取
  • 使用pandas库或者csv模块来存储或处理提取的数据,支持多种数据格式
  • 使用亿牛云爬虫代理服务来隐藏真实IP地址,防止被网站封禁
  • 使用多线程或者协程来并发发送HTTP请求,提高爬虫的速度和效率
  • 使用try-except语句或者logging模块来处理异常和错误,增加爬虫的稳定性和可维护性

正文

下面我们将使用Python编写一个简单的爬虫程序,实现对汽车之家的车型参数数据的自动化采集。我们以"奥迪A4L"为例,获取其所有在售车型的基本参数、动力参数、底盘转向参数、安全装备参数和外部配置参数。

1. 导入所需库和模块

首先,我们需要导入以下几个库和模块:

# 导入requests库,用于发送HTTP请求
import requests# 导入BeautifulSoup库,用于解析网页源代码
from bs4 import BeautifulSoup# 导入pandas库,用于存储或处理提取的数据
import pandas as pd# 导入time模块,用于控制爬虫速度
import time# 导入random模块,用于生成随机数
import random# 导入threading模块,用于实现多线程爬虫
import threading# 导入queue模块,用于实现线程间通信
import queue# 导入logging模块,用于记录日志信息
import logging

2. 定义全局变量和常量

接下来,我们需要定义一些全局变量和常量,用于存储或控制爬虫程序的运行状态:

# 定义奥迪A4L的车型参数页面的URL
URL = 'https://www.autohome.com.cn/3170/#levelsource=000000000_0&pvareaid=101594'# 定义亿牛云爬虫代理的域名、端口、用户名、密码
PROXY_HOST = 'www.16yun.cn'
PROXY_PORT = '8020'
PROXY_USER = '16YUN'
PROXY_PASS = '16IP'# 定义爬虫代理的HTTP头部
PROXY_HEADERS = {'Proxy-Authorization': 'Basic ' + base64.b64encode((PROXY_USER + ':' + PROXY_PASS).encode()).decode()
}# 定义爬虫请求的HTTP头部UserAgent
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}# 定义爬虫请求的超时时间(秒)
TIMEOUT = 10# 定义爬虫请求的重试次数
RETRY = 3# 定义爬虫请求的最小间隔时间(秒)
MIN_DELAY = 1# 定义爬虫请求的最大间隔时间(秒)
MAX_DELAY = 3# 定义爬虫线程的数量
THREADS = 10# 定义车型参数数据的列名
COLUMNS = ['车型', '基本参数', '动力参数', '底盘转向参数', '安全装备参数', '外部配置参数']# 定义车型参数数据的空列表,用于存储提取的数据
DATA = []# 定义车型URL的队列,用于实现线程间通信
QUEUE = queue.Queue()# 定义日志格式和级别
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)

3. 定义发送HTTP请求的函数

然后,我们需要定义一个函数,用于发送HTTP请求,获取网页源代码:

def get_html(url):# 初始化重试次数retry = RETRY# 循环发送HTTP请求,直到成功或达到重试次数上限while retry > 0:try:# 使用requests库发送HTTP请求,设置代理和超时时间response = requests.get(url, headers=HEADERS, proxies={'http': f'http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}'}, timeout=TIMEOUT)# 判断HTTP响应状态码是否为200,即成功if response.status_code == 200:# 返回网页源代码return response.text# 否则,记录错误信息,并减少重试次数else:logging.error(f'请求失败,状态码:{response.status_code},URL:{url}')retry -= 1# 捕获异常,并记录错误信息,并减少重试次数except Exception as e:logging.error(f'请求异常,异常信息:{e},URL:{url}')retry -= 1# 如果重试次数为0,说明请求失败,返回空值if retry == 0:logging.error(f'请求失败,重试次数用尽,URL:{url}')return None

4. 定义解析网页源代码的函数

接着,我们需要定义一个函数,用于解析网页源代码,提取所需数据:

def parse_html(html):# 使用BeautifulSoup库解析网页源代码,指定解析器为lxmlsoup = BeautifulSoup(html, 'lxml')# 使用XPath语法提取车型名称car_name = soup.select_one('//div[@class="subnav-title-name"]/a/text()')# 使用XPath语法提取车型参数表格car_table = soup.select_one('//div[@id="config_data"]/div/table')# 判断车型名称和车型参数表格是否存在if car_name and car_table:# 初始化车型参数数据的字典,用于存储提取的数据car_data = {}# 将车型名称添加到车型参数数据的字典中,作为第一个键值对# 使用XPath语法提取车型参数表格的所有行car_rows = car_table.select('//tr')# 遍历车型参数表格的所有行for car_row in car_rows:# 使用XPath语法提取每一行的第一个单元格,即参数类别car_category = car_row.select_one('//th/text()')# 使用XPath语法提取每一行的第二个单元格,即参数值car_value = car_row.select_one('//td/div/text()')# 判断参数类别和参数值是否存在if car_category and car_value:# 将参数类别和参数值添加到车型参数数据的字典中,作为键值对car_data[car_category] = car_value# 返回车型参数数据的字典return car_data# 否则,记录错误信息,并返回空值else:logging.error('解析失败,无法提取车型名称或车型参数表格')return None

5. 定义存储或处理提取的数据的函数

然后,我们需要定义一个函数,用于存储或处理提取的数据:

def save_data(data):# 判断数据是否存在if data:# 将数据添加到车型参数数据的空列表中DATA.append(data)# 记录信息,显示数据已保存logging.info(f'数据已保存,车型:{data["车型"]}')# 否则,记录错误信息,显示数据为空else:logging.error('数据为空,无法保存')

6. 定义爬虫线程的类

接着,我们需要定义一个类,用于实现爬虫线程的功能:

class SpiderThread(threading.Thread):# 重写初始化方法,传入线程名称和队列对象def __init__(self, name, queue):# 调用父类的初始化方法super().__init__()# 设置线程名称self.name = name# 设置队列对象self.queue = queue# 重写运行方法,实现爬虫逻辑def run(self):# 记录信息,显示线程开始运行logging.info(f'线程{self.name}开始运行')# 循环从队列中获取车型URL,直到队列为空while not self.queue.empty():# 从队列中获取车型URL,并移除该元素url = self.queue.get()# 记录信息,显示正在处理该URLlogging.info(f'线程{self.name}正在处理{url}')# 调用发送HTTP请求的函数,获取网页源代码html = get_html(url)# 判断网页源代码是否存在if html:# 调用解析网页源代码的函数,提取所需数据data = parse_html(html)# 调用存储或处理提取的数据的函数,保存或处理数据save_data(data)# 否则,记录错误信息,显示网页源代码为空else:logging.error(f'网页源代码为空,无法处理{url}')# 生成一个随机数,作为爬虫请求的间隔时间delay = random.randint(MIN_DELAY, MAX_DELAY)# 记录信息,显示爬虫请求的间隔时间logging.info(f'线程{self.name}等待{delay}秒')# 使用time模块暂停爬虫请求的间隔时间time.sleep(delay)# 记录信息,显示线程结束运行logging.info(f'线程{self.name}结束运行')

7. 定义主函数

最后,我们需要定义一个主函数,用于启动爬虫程序:

def main():# 记录信息,显示爬虫程序开始运行logging.info('爬虫程序开始运行')# 调用发送HTTP请求的函数,获取车型参数页面的网页源代码html = get_html(URL)# 判断网页源代码是否存在if html:# 使用BeautifulSoup库解析网页源代码,指定解析器为lxmlsoup = BeautifulSoup(html, 'lxml')# 使用XPath语法提取所有在售车型的URL列表car_urls = soup.select('//div[@id="config_data"]/div/div/ul/li/a/@href')# 判断车型URL列表是否存在if car_urls:# 遍历车型URL列表for car_url in car_urls:# 将车型URL添加到车型URL的队列中QUEUE.put(car_url)# 初始化一个空列表,用于存储爬虫线程对象threads = []# 遍历爬虫线程的数量范围for i in range(THREADS):# 创建一个爬虫线程对象,并传入线程名称和队列对象thread = SpiderThread(f'线程{i+1}', QUEUE)# 将爬虫线程对象添加到爬虫线程对象的空列表中threads.append(thread)# 遍历爬虫线程对象的空列表for thread in threads:# 启动爬虫线程thread.start()# 遍历爬虫线程对象的空列表for thread in threads:# 等待爬虫线程结束thread.join()# 记录信息,显示所有爬虫线程已结束logging.info('所有爬虫线程已结束')# 否则,记录错误信息,显示车型URL列表为空else:logging.error('车型URL列表为空,无法继续爬取')# 否则,记录错误信息,显示网页源代码为空else:logging.error('网页源代码为空,无法继续爬取')# 判断车型参数数据的空列表是否存在if DATA:# 使用pandas库创建一个数据框对象,传入车型参数数据的空列表和列名df = pd.DataFrame(DATA, columns=COLUMNS)# 使用pandas库将数据框对象保存为CSV文件,指定文件名和编码格式df.to_csv('car_data.csv', encoding='utf-8-sig', index=False)# 记录信息,显示数据已导出为CSV文件logging.info('数据已导出为CSV文件')# 否则,记录错误信息,显示数据为空else:logging.error('数据为空,无法导出')# 记录信息,显示爬虫程序结束运行logging.info('爬虫程序结束运行')

结语

本文介绍了如何使用Python编写一个简单的爬虫程序,实现对汽车之家的车型参数数据的自动化采集,并使用亿牛云爬虫代理服务来提高爬虫的稳定性和效率。本文只是一个简单的示例,实际的爬虫开发可能需要更多的技巧和知识。希望本文能够对你有所帮助和启发。

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

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

相关文章

Android 实现椭圆形中心发散渐变绘制

1. 前言 工作中有一个需求,需要实现一个椭圆形的中心发散渐变效果,并且可以自由指定椭圆比例,旋转角度等。 Android中实现椭圆形的绘制很简单,只需要调用canvas.drawOval()就可以了,圆形的中心发散渐变可以使用RadialGradient,但是椭圆形的中心发散渐变效果Android自带的…

浅谈Deep Learning 与 Machine Learning 与Artificial Intelligence

文章目录 三者的联系与区别 三者的联系与区别 “Deep Learning is a kind of Machine Learning, and Machine Learning is a kind of Artificial Intelligence.” 人工智能(AI),机器学习(Machine Learning,简称ML&am…

Linux环境变量配置说明(配置jdk为例-摘录自尚硅谷技术文档)

配置环境变量的不同方法 Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/.sh,~/.bashrc,~/.bash_profile等,下面说明上述几个文件之间的关系和区别。 bash的运行模式可分为login shell和non-login shell。 例…

Unity3D C# 反射与特性的配合使用

需求分析 情况: 假如我们是一个动物园的管理员,我们需要统计园内的所有动物和动物的行为。 举例: 现在园区内有猫、狗和鸡。猫对应的行为是喵喵喵和卖萌,狗对应狗吠和干饭,鸡对应篮球和打鸣那么这时候我要统计这些&a…

R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据...

全文链接:http://tecdat.cn/?p24492 此分析的目的是构建一个过程,以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括 1258 天的股票收益(点击文末“阅读原文”获取完整代码数…

Linux chmod命令——修改权限信息

我们可以使用chmod命令,修改文件、文件夹的权限信息。注意,只有文件、文件夹的所属用户或root用户可以修改。 chmod [-R] 权限 文件或文件夹 -R,对文件夹内的全部内容应用同样的操作 例如: chmod urwx,grx,ox hello.txt &…

基于微信小程序的项目申报管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有:管理员的主要功能有:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉…

flarum 论坛 User Statistics插件修改

此插件在中国使用日期不是很理想,于是决定修改代码 下面是插件信息: User Statistics A Flarum extension. Add some user statistics in flarum posts, this extension require clarkwinkelmann/flarum-ext-likes-received and will be installed au…

【postgresql】替换 mysql 中的ifnull()

数据库由mysql 迁移到postgresql,程序在执行查询时候报错。 HINT: No function matches the given name and argument types. You might need to add explicit type casts. CONTEXT: referenced column: ifnull 具体SQL: SELECT ifnull(phone,) FROM c_user p…

Rust中的结构体

专栏简介:本专栏作为Rust语言的入门级的文章,目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言,虽然历史没有C、和python历史悠远,但是它的优点可以说是非常的多,既继承了C运行速度,还拥有了Java…

钾和钠含量

声明 本文是学习GB-T 397-2022 商品煤质量 炼焦用煤. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了炼焦用商品煤产品质量等级和技术要求、试验方法、检验规则、标识、运输及贮存。 本文件适用于生产、加工、储运、销售、使用…

MySQL索引事务

一 、 索引 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。 可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。 索引保存的数据结构主要为B树,及hash的方式。 1. 作用 数据库中…

网络安全攻防对抗之隐藏通信隧道技术整理

完成内网信息收集工作后,渗透测试人员需要判断流量是否出得去、进得来。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。 一、隐藏通信隧道基础知识 (一)隐藏通信隧道概述 一般的网络通…

【C++】String类基本接口介绍(多看英文文档)

string目录 目录 如果你很赶时间,那么就直接看我本标题下的内容即可!! 一、STL简介 1.1什么是STL 1.2STL版本 1.3STL六大组件 1.4STL重要性 1.5如何学习STL 二、什么是string??(本质上是一个类&…

Spring Boot虚拟线程的性能还不如Webflux?

早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。 测试场景 作者采用了一个尽可能贴近现实操作的场景: 从授权头信息中提取JWT验证…

排序算法:非比较排序(计数排序)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通…

三子棋小游戏(简单详细)

设计总体思路 实现游戏可以一直玩,先打印棋盘,玩家和电脑下棋,最后分出胜负。 如果编写较大的程序,我们可以分不同模块 例如这个三子棋,我们可以创建三个文件 分别为: game.h 函数的声明game.c 函数…

Linux 快捷键

1、快捷键小操作 1.1、ctrl c 强制停止 Linux某些程序的运行,如果想要强制停止它,可以使用快捷键ctrl c 命令输入错误,也可以通过快捷键ctrl c,退出当前输入,重新输入 1.2、ctrl d 退出或登出 可以通过快捷键&…

python的requests响应请求,结果乱码,即使设置了response.encoding也没有用的解决方法

一、问题 如图: 一般出现乱码,我们会有三种解决方式,如下但是图中解决了发现还是不行, response.encodingresponse.apparent_encoding通过看网页源码对response.encodingutf8指定编码格式或者直接通过response.content.decode()来获得源码 出…

辨析常见的医学数据分析(相关性分析回归分析)

目录 1 常见的三种分类结果? 2 什么是相关性分析? 相关性分析的结果怎么看? 3 什么是回归分析? 1)前提 2)常见的回归模型 4 对于存在对照组实验的医学病例如何分析? 1)卡方检验…