• Python爬虫详解:原理、常用库与实战案例


    前言

    请添加图片描述

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家https://www.captainbed.cn/z
    请添加图片描述

    ChatGPT体验地址

    请添加图片描述

    引言:

    随着互联网的快速发展,数据成为了新时代的石油。Python作为一种高效、易学的编程语言,在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例,帮助读者掌握爬虫技能。
    在这里插入图片描述

    一、爬虫原理

    爬虫,又称网络爬虫,是一种自动获取网页内容的程序。它模拟人类浏览网页的行为,发送HTTP请求,获取网页源代码,再通过解析、提取等技术手段,获取所需数据。

    1. HTTP请求与响应过程

    爬虫首先向目标网站发送HTTP请求,请求可以包含多种参数,如URL、请求方法(GET或POST)、请求头(Headers)等。服务器接收到请求后,返回相应的HTTP响应,包括状态码、响应头和响应体(网页内容)。

    2. 常用爬虫技术

    (1)请求库:如requests、aiohttp等,用于发送HTTP请求。
    (2)解析库:如BeautifulSoup、lxml、PyQuery等,用于解析网页内容。
    (3)存储库:如pandas、SQLite等,用于存储爬取到的数据。
    (4)异步库:如asyncio、aiohttp等,用于实现异步爬虫,提高爬取效率。

    二、Python爬虫常用库

    1. 请求库

    (1)requests:简洁、强大的HTTP库,支持HTTP连接保持和连接池,支持SSL证书验证、Cookies等。
    (2)aiohttp:基于asyncio的异步HTTP网络库,适用于需要高并发的爬虫场景。

    2. 解析库

    (1)BeautifulSoup:一个HTML和XML的解析库,简单易用,支持多种解析器。
    (2)lxml:一个高效的XML和HTML解析库,支持XPath和CSS选择器。
    (3)PyQuery:一个Python版的jQuery,语法与jQuery类似,易于上手。

    3. 存储库

    (1)pandas:一个强大的数据分析库,提供数据结构和数据分析工具,支持多种文件格式。
    (2)SQLite:一个轻量级的数据库,支持SQL查询,适用于小型爬虫项目。

    三、编写一个简单的Python爬虫

    以爬取豆瓣电影TOP250为例,讲解如何编写一个简单的Python爬虫。

    1. 设计爬虫需求
      爬取豆瓣电影TOP250的电影名称、评分、导演等信息。
    2. 编写代码
      (1)使用requests库发送HTTP请求,获取网页源代码。
      (2)使用BeautifulSoup库解析网页内容,提取所需数据。
      (3)使用pandas库存储数据,并保存为CSV文件。
    3. 运行爬虫并展示结果
    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    # 豆瓣电影TOP250的基础URL
    base_url = 'https://movie.douban.com/top250'
    # 定义一个函数来获取页面内容
    def get_page_content(url):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        else:
            print('请求页面失败:', response.status_code)
            return None
    # 定义一个函数来解析页面内容
    def parse_page_content(html):
        soup = BeautifulSoup(html, 'html.parser')
        movie_list = soup.find_all('div', class_='item')
        movies = []
        for movie in movie_list:
            title = movie.find('span', class_='title').get_text()
            rating = movie.find('span', class_='rating_num').get_text()
            director = movie.find('p', class_='').find('a').get_text()
            movies.append({'title': title, 'rating': rating, 'director': director})
        return movies
    # 定义一个函数来保存数据到CSV文件
    def save_to_csv(movies):
        df = pd.DataFrame(movies)
        df.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig')
    # 主函数,用于运行爬虫
    def main():
        movies = []
        for i in range(0, 250, 25):  # 豆瓣电影TOP250分为10页,每页25部电影
            url = f'{base_url}?start={i}&filter='
            html = get_page_content(url)
            if html:
                movies.extend(parse_page_content(html))
        save_to_csv(movies)
        print('爬取完成,数据已保存到douban_top250.csv')
    # 运行主函数
    if __name__ == '__main__':
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    在实际使用中,需要根据豆瓣网站的实际情况调整以下内容:

    1. URL和参数:根据豆瓣电影的URL结构和参数进行设置。
    2. BeautifulSoup选择器:根据网页源代码的结构编写正确的选择器来提取数据。
      此外,为了遵守网站的使用协议和法律法规,请确保在编写爬虫时遵循以下几点:
    • 遵守Robots协议,不爬取网站禁止爬取的内容。
    • 设置合理的请求间隔,避免对网站服务器造成过大压力。
    • 如果遇到网站的反爬措施,如验证码、IP封禁等,请合理应对,遵守网站规定。
    • 使用爬虫获取的数据请勿用于商业目的或侵犯他人隐私。
      最后,由于网站结构可能会发生变化,上述代码可能需要根据实际情况进行调整。在实际应用中,请确保您的爬虫行为合法合规。

    四、爬虫实战案例

    以爬取某招聘网站职位信息为例,讲解如何编写一个实用的Python爬虫。

    1. 分析网站结构

    通过观察招聘网站的URL、参数和页面结构,找到职位信息的来源。

    2. 编写爬虫代码

    (1)使用requests库发送带参数的HTTP请求,获取职位列表。
    (2)使用lxml库解析职位列表,提取职位详情页URL。
    (3)使用PyQuery库解析职位详情页,提取职位信息。
    (4)使用SQLite数据库存储职位信息。
    3. 结果展示与分析

    import requests
    from lxml import etree
    from pyquery import PyQuery as pq
    import sqlite3
    # 创建或连接SQLite数据库
    conn = sqlite3.connect('job.db')
    cursor = conn.cursor()
    # 创建职位信息表
    cursor.execute('CREATE TABLE IF NOT EXISTS job (id INTEGER PRIMARY KEY, title TEXT, salary TEXT, company TEXT, location TEXT)')
    # 分析网站结构后得到的职位列表URL
    url = 'https://www.example.com/jobs'
    # 发送HTTP请求获取职位列表
    params = {
        'page': 1,  # 假设页面参数为page,这里请求第1页
        'city': 'beijing'  # 假设城市参数为city,这里请求北京地区的职位
    }
    response = requests.get(url, params=params)
    response.encoding = 'utf-8'  # 设置字符编码,防止乱码
    # 使用lxml解析职位列表,提取职位详情页URL
    html = etree.HTML(response.text)
    job_list = html.xpath('//div[@class="job-list"]/ul/li/a/@href')  # 假设职位详情页URL在a标签的href属性中
    # 遍历职位详情页URL,爬取职位信息
    for job_url in job_list:
        job_response = requests.get(job_url)
        job_response.encoding = 'utf-8'
        job_html = pq(job_response.text)
        # 使用PyQuery解析职位详情页,提取职位信息
        title = job_html('.job-title').text()  # 假设职位名称在class为job-title的元素中
        salary = job_html('.job-salary').text()  # 假设薪资信息在class为job-salary的元素中
        company = job_html('.job-company').text()  # 假设公司名称在class为job-company的元素中
        location = job_html('.job-location').text()  # 假设工作地点在class为job-location的元素中
        # 存储职位信息到SQLite数据库
        cursor.execute('INSERT INTO job (title, salary, company, location) VALUES (?, ?, ?, ?)', (title, salary, company, location))
        conn.commit()
    # 关闭数据库连接
    cursor.close()
    conn.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在实际使用中,需要根据目标网站的实际情况调整以下内容:

    1. URL和参数:根据目标网站的URL结构和参数进行设置。
    2. Xpath表达式:根据网页源代码的结构编写正确的Xpath表达式来提取数据。
    3. PyQuery选择器:根据网页源代码的结构编写正确的CSS选择器来提取数据。
    4. 数据库操作:根据需要创建合适的数据库表结构,并插入数据。
      此外,为了遵守网站的使用协议和法律法规,请确保在编写爬虫时遵循以下几点:
    • 遵守Robots协议,不爬取网站禁止爬取的内容。
    • 设置合理的请求间隔,避免对网站服务器造成过大压力。
    • 如果遇到网站的反爬措施,如验证码、IP封禁等,请合理应对,遵守网站规定。
    • 使用爬虫获取的数据请勿用于商业目的或侵犯他人隐私。

    五、爬虫注意事项与技巧

    1. 遵循Robots协议
      尊重网站的爬虫协议,避免爬取禁止爬取的内容。
    2. 设置合理的请求间隔
      避免对目标网站服务器造成过大压力,合理设置请求间隔。
    3. 处理反爬虫策略
      了解并应对网站的反爬虫策略,如IP封禁、验证码等。
    4. 使用代理IP、Cookies等技巧
      提高爬虫的稳定性和成功率。
    5. 分布式爬虫的搭建与优化
      使用Scrapy-Redis等框架,实现分布式爬虫,提高爬取效率。
      六、Python爬虫框架
    6. Scrapy:强大的Python爬虫框架,支持分布式爬取、多种数据格式、强大的插件系统等。
    7. Scrapy-Redis:基于Scrapy和Redis的分布式爬虫框架,实现分布式爬取和去重功能。

    结语:

    通过本文的讲解,相信读者已经对Python爬虫有了较为全面的认识。爬虫技能在数据分析、自然语言处理等领域具有广泛的应用,希望读者能够动手实践,不断提高自己的技能水平。同时,请注意合法合规地进行爬虫,遵守相关法律法规。祝您学习愉快!
    在这里插入图片描述

  • 相关阅读:
    Mini-dashboard 和meilisearch配合使用
    mysql基础_索引
    【spring】SpringBoot与SpringCloud的版本对应
    神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了
    【系统架构】-如何评估软件架构
    走进中国水果罐头领军品牌真心罐头—快消食品企业的全链路数字化
    tomcat 端口 8005 被 windows 系统服务占用导致启动闪退的问题
    Python卡方分布
    zabbix学习1--zabbix6.x单机
    什么是浏览器指纹识别
  • 原文地址:https://blog.csdn.net/Why_does_it_work/article/details/137229465