admin 管理员组文章数量: 887629
一、引言
在上一篇教程中,介绍了如何在python 中使用requests库和BeautifulSoup库,爬取云起书院会员榜单上200+本热门小说的网页信息、解析网页提取想要的数据。而在本篇教程中,我们将再次对前一章的学习到的两个库进行练习,深入探索如何爬取汽车之家网站上深圳二手车的信息,同时了解一些应对阻拦的方法。相信通过两个实战项目的训练,大家将逐步掌握从发送网络请求到精准解析 HTML 页面,再到高效提取关键数据的整套流程,为后续更复杂的爬虫应用奠定坚实基础。
二、环境准备
在开启数据爬取之旅前,请和之前一样,务必确保你的 Python 环境已经成功安装了以下几个关键库。它们将如同我们的得力助手,协助我们顺利完成任务。以下是搭建环境的步骤:
(1)开发环境:Jupyter Notebook
推荐使用Jupyter Notebook作为我们的主要开发环境。Jupyter Notebook 是一个开源的 Web 应用程序,非常适合于数据清洗和转换、数值模拟、统计建模、数据可视化以及许多其他类型的数据分析工作。(如果你还没有安装,推荐通过安装 Anaconda去启动并创建一个Jupyter Notebook)
(2)安装:库
教程中将使用以下Python库:requests、beautifulsoup4、xlsxwriter、random、time。你可以通过运行以下命令在Notebook完成对他们的安装。注意:需先使用“!pip”安装库,再用 from.... import从库中导入所需要的工具。
!pip install requests
!pip install beautifulsoup4
!pip install xlsxwriter
import requests
from bs4 import BeautifulSoup
import xlsxwriter
import time
import random
(3)工具介绍
- requests、beautifulsoup4、xlsxwriter 的介绍请参考上一篇教程
- time:控制请求时间,避免请求的频繁过高被阻拦。
random:
是Python 标准库中的一个模块,它包含用于生成随机数的函数。这个模块可以用来生成随机整数、浮点数、随机选择项目以及随机打乱序列等。
三、目标网站分析
我们本次的目标是汽车之家网站上深圳地区的二手车信息页面。在这里,我们能获取每辆二手车的车辆型号、详细描述、当前价格、原始价格以及对应的车辆链接等重要信息。
打开汽车之家的深圳二手车页面,仔细观察其页面布局与结构,你会发现这些信息都隐藏在 HTML 代码的各个角落。不过,要注意的是网站可能存在反爬虫机制,我们后续代码中会有相应应对措施。
四、代码实现
(一)发送请求获取页面内容
首先,我们利用 requests
库来构建与目标网站的连接,并获取网页的 HTML 内容。这就好比我们派出一位使者,前往网站请求所需的信息资源。在这个过程中,设置合理的请求头(headers
)是一种常见的防阻拦手段,通过模拟浏览器正常访问的请求头信息,让网站服务器更难识别出我们是爬虫程序。
def get_page_content(url, headers):
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.text
except requests.RequestException as e:
print(f"请求出错: {e}")
return None
(二)解析 HTML 页面
打开开发者页面,我们可以从"carinfo"中看到我们想要的所有信息在HTML的具体位置和名称
有了页面内容后,我们借助 BeautifulSoup4
库”,对 HTML 页面进行精细解析,精准地提取出我们想要的二手车信息。
def extract_car_info(data):
link = 'https://www.che168' + data.get('href', '')
name = data.select_one('h4')
car = data.select_one('p')
price = data.select_one('span')
value = data.select_one('s')
return [name_text, car_text, price_text, value_text, link]
(三)爬取多页数据
为了获取更丰富的数据资源,可以编写一个函数来实现多页数据的爬取,并将这些数据保存到 “Excel 文件中,方便后续的查阅与分析。
- 建立一个叫“汽车之家”的Excel表格:
def crawl_pages(url, pages):
wb = xlsxwriter.Workbook('汽车之家.xlsx')
ws = wb.add_worksheet('二手车信息')
head = ['车辆型号', '关于', '现价', '原价', '链接']
ws.write_row(0, 0, head)
在这个函数中,有几处涉及防阻拦的关键操作:
-
随机延迟(Time Sleep):我们通过
time.sleep(random.uniform(1, 3))
语句让爬虫在每爬取完一页后,随机暂停 1 到 3 秒。这样做是为了避免过于频繁地向服务器发送请求,模拟人类正常浏览网页时的操作间隔,降低被网站识别为爬虫并阻拦的风险。m = 1 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } for i in range(1, pages + 1): print(f'共{pages}页,正在爬取第{i}页......') page_content = get_page_content(url, headers) # 确保传入两个参数 if page_content: soup = BeautifulSoup(page_content, 'html.parser') lists = soup.select('a.carinfo') result = [] for data in lists: car_info = extract_car_info(data) result.append(car_info) # 写入表格 for j in range(len(car_info)): ws.write(m, j, car_info[j]) m += 1 print(f'第{i}页爬取完成,共{len(result)}条数据') # 获取下一页的URL next_page_tag = soup.select_one('a.page-item-next') if next_page_tag and next_page_tag.get('href'): next_page = 'https://www.che168' + next_page_tag.get('href') url = next_page if next_page.startswith('http') else next_page else: print('没有找到下一页的链接,停止爬取') break else: print(f'第{i}页爬取失败') break # 随机延迟,减少请求频率 time.sleep(random.uniform(1, 3)) # 1到3秒之间随机延迟 # 更新User-Agent,模拟不同的浏览器访问 headers['User-Agent'] = generate_user_agent() wb.close()
-
动态更换 User-Agent:使用
generate_user_agent()
函数来随机选择不同的User-Agent
值,并更新请求头中的User-Agent
。不同的浏览器有不同的User-Agent
标识,频繁用同一个User-Agent
访问容易被识别,通过动态更换,让我们的请求看起来更像是来自不同的真实浏览器访问,增加迷惑性,提高绕过阻拦的概率def generate_user_agent(): user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0', # 更多User-Agent... ] return random.choice(user_agents)
(四)运行爬虫代码
最后,根据前面写的爬虫代码,输入想要抓去的页面数量开始数据的过程吧!
if __name__ == "__main__":
start_url = 'https://www.che168/shenzhen/list/#pvareaid=104649'
pages_to_crawl = 6 # 爬取6页
crawl_pages(start_url, pages_to_crawl)
五、运行结果展示
运行后,我们将在本地得到一个名为 汽车之家.xlsx
的 Excel 文件,里面记录着300+爬取的二手车信息,详细记录着一辆车的各项关键数据。
六、总结
本次教程,再次运用 requests
和 BeautifulSoup4
库,实现了对汽车之家深圳二手车信息的爬取,并将300+数据保存到 Excel 文件中。同时,本次也增加说明了一些在爬虫过程中应对网站阻拦的常用方法,如设置合理请求头、随机延迟以及动态更换 User-Agent
等。这仅仅是我们爬虫之旅的一个小小开端,在未来的探索中,你可以根据实际需求,对这个爬虫程序进行灵活的修改与扩展,使其能够应对更加复杂多变的爬取任务。
版权声明:本文标题:0基础Python爬虫教程第二篇:抓取300+深圳二手车网站信息 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1735051733h1695539.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论