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

一.爬虫介绍

1.什么是爬虫

爬虫(Spider),也被称为网络爬虫或网络蜘蛛,是一种自动化程序,用于在互联网上浏览和提取信息。爬虫通过模拟人类用户访问网页的行为,从网页中提取数据并将其存储或进行进一步处理。

爬虫可以自动遍历互联网上的各个网页,并根据预设的规则和算法来解析和收集感兴趣的信息。这些信息可以包括网页的文本内容、图片、链接、视频等等。爬虫可以用于很多领域,例如搜索引擎的网页索引、数据挖掘、自动化测试、价格比较、舆情监测等等。

当然,在使用爬虫时需要遵守一定的法律和道德准则,并尊重网站的隐私政策和使用条款,确保合法和负责任地使用爬虫技术。

2.爬虫的工作流程

当爬虫开始工作时,它会首先选择一个起始网页作为起点,然后按照一定的规则逐步解析和访问其他链接。爬虫通过发送 HTTP 请求获取网页内容,并使用 HTML 解析器来提取所需的数据。

以下是爬虫工作的一般流程:

确定起始网页:选择一个或多个起始网页作为爬虫开始抓取的入口点。

发送HTTP请求:爬虫发送HTTP请求到起始网页的服务器,获取网页的原始HTML代码。

解析HTML:爬虫使用HTML解析器(如Beautiful Soup或正则表达式)来解析HTML代码,从中提取出有用的数据,如文本、图片、链接等。

处理数据:爬虫对提取的数据进行处理、清洗和整理,以便后续的存储和分析。

跟踪链接:爬虫从当前网页中提取出其他链接,将它们添加到待抓取列表中,然后按照一定的策略选择下一个要抓取的链接。

递归抓取:爬虫通过递归地重复上述步骤,不断抓取新的网页,并提取其中的数据,直到满足某个停止条件(如达到抓取深度、抓取数量或遇到指定的终止条件)。

存储数据:爬虫将抓取的数据保存到数据库、文件或其他存储介质中,以便后续的使用和分析。

爬虫的工作需要考虑一些因素,例如网页的反爬虫机制、遵守网站的robots.txt文件、限速策略以避免对服务器造成过大负载等。同时,应该遵守法律和道德规范,在抓取数据时尊重网站的隐私政策和使用条款。

3. 常用爬虫技术

(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.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. URL和参数:根据目标网站的URL结构和参数进行设置。

2.Xpath表达式:根据网页源代码的结构编写正确的Xpath表达式来提取数据。

3.PyQuery选择器:根据网页源代码的结构编写正确的CSS选择器来提取数据。

4.数据库操作:根据需要创建合适的数据库表结构,并插入数据。

此外,为了遵守网站的使用协议和法律法规,请确保在编写爬虫时遵循以下几点:

· 遵守Robots协议,不爬取网站禁止爬取的内容。

· 设置合理的请求间隔,避免对网站服务器造成过大压力。

· 如果遇到网站的反爬措施,如验证码、IP封禁等,请合理应对,遵守网站规定。

· 使用爬虫获取的数据请勿用于商业目的或侵犯他人隐私。

五、爬虫注意事项与技巧

1.遵循Robots协议

尊重网站的爬虫协议,避免爬取禁止爬取的内容。

2.设置合理的请求间隔

避免对目标网站服务器造成过大压力,合理设置请求间隔。

3.处理反爬虫策略

了解并应对网站的反爬虫策略,如IP封禁、验证码等。

4.使用代理IP、Cookies等技巧

提高爬虫的稳定性和成功率。

5.分布式爬虫的搭建与优化

使用Scrapy-Redis等框架,实现分布式爬虫,提高爬取效率。

6.Scrapy:

强大的Python爬虫框架,支持分布式爬取、多种数据格式、强大的插件系统等。

7.Scrapy-Redis:

基于Scrapy和Redis的分布式爬虫框架,实现分布式爬取和去重功能。

以上就是文章的内容了,相信大家对爬虫应该有了比较全面的认识了,爬虫在各个领域都具有广泛的应用,希望读者能够动手实践,不断提高自己的技能水平。

同时,请注意合法合规地进行爬虫,遵守相关法律法规。祝您学习愉快!

最后

如果你也想学习Python,可以关注我,我会把自己知道的,曾经走过的弯路都告诉你,让你在学习Python的路上更加顺畅。

我自己也整理了一套最新的Python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。如果你也喜欢编程,想通过学习Python转行、做副业或者提升工作效率,这份【最新全套Python学习资料】 一定对你有用!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习、Python量化交易等学习教程。带你从零基础系统性的学好Python!

由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。

                                     **(扫码立即免费领取)**

全套Python学习资料分享:

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频全套

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。


相关推荐
CV大法好2 分钟前
刘铁猛C#入门 027 抽象和开闭原则
开发语言·c#
七侠镇莫尛貝大侠20237 分钟前
C:mbedtls库实现https双向认证连接示例_七侠镇莫尛貝大侠20241122
c语言·开发语言·https
数据小爬虫@9 分钟前
利用Python爬虫获取淘宝商品评论:实战案例分析
开发语言·爬虫·python
逝去的紫枫16 分钟前
Python PIL:探索图像处理的无限可能
图像处理·人工智能·python
苹果酱056718 分钟前
springcloud-网关路由gateway
java·开发语言·spring boot·mysql·中间件
梦幻精灵_cq22 分钟前
Python中“暂停”(time.sleep?input?)
python
武子康24 分钟前
Java-08 深入浅出 MyBatis - 多对多模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据库·sql·mybatis
摇滚侠32 分钟前
java http body的格式 ‌application/x-www-form-urlencoded‌不支持文件上传
java·开发语言·http
檀越剑指大厂41 分钟前
【Python系列】 Base64 编码:使用`base64`模块
开发语言·python