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 文件中,方便后续的查阅与分析。

  1. 建立一个叫“汽车之家”的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 等。这仅仅是我们爬虫之旅的一个小小开端,在未来的探索中,你可以根据实际需求,对这个爬虫程序进行灵活的修改与扩展,使其能够应对更加复杂多变的爬取任务。

本文标签: 爬虫 深圳 二手车 第二篇 基础