当前位置: 首页 > news >正文

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

 如果你正在学习Python,那么你需要的话可以,点击这里👉Python重磅福利:入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享!

Python爬虫是一种自动获取网页内容的程序,其原理是模拟人类用户访问网页的行为,从网页中提取数据并将其存储或进行进一步处理。常用的Python爬虫库有requests、BeautifulSoup和Scrapy等。

  1. 爬虫介绍与原理

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

    • 爬虫定义:爬虫(Spider),也被称为网络爬虫或网络蜘蛛,是一种自动化程序,用于在互联网上浏览和提取信息。

    • 爬虫工作流程:爬虫通过发送HTTP请求获取网页内容,使用HTML解析器(如Beautiful Soup或正则表达式)解析HTML代码,提取有用的数据,如文本、图片、链接等,并进行处理、清洗和整理,以便后续的存储和分析。

  1. 常用爬虫技术与库

    • 请求库:如requests、aiohttp,用于发送HTTP请求。

    • 解析库:如BeautifulSoup、lxml、PyQuery,用于解析网页内容。

    • 存储库:如pandas、SQLite,用于存储爬取到的数据。

    • 异步库:如asyncio、aiohttp,用于实现异步爬虫,提高爬取效率。

  2. 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查询,适用于小型爬虫项目。

  1. 简单爬虫编写

    • 需求设计:以爬取豆瓣电影TOP250为例,需要爬取的信息包括电影名称、评分、导演等。

    • 代码实现:使用requests库发送HTTP请求,获取网页源代码,使用BeautifulSoup库解析网页内容,提取所需数据,使用pandas库存储数据,并保存为CSV文件。

  2. 运行爬虫与展示结果

    • 主函数:在主函数中,遍历豆瓣电影TOP250的各页URL,调用上述函数获取页面内容、解析页面内容和保存数据到CSV文件。

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

设计爬虫需求

爬取豆瓣电影TOP250的电影名称、评分、导演等信息。

编写代码

(1)使用requests库发送HTTP请求,获取网页源代码。

(2)使用BeautifulSoup库解析网页内容,提取所需数据。

(3)使用pandas库存储数据,并保存为CSV文件。

运行爬虫并展示结果

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.textelse: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()

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

URL和参数:根据豆瓣电影的URL结构和参数进行设置。

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()

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

URL和参数:根据目标网站的URL结构和参数进行设置。

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

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

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

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

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

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

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

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

五、爬虫注意事项与技巧

遵循Robots协议

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

设置合理的请求间隔

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

处理反爬虫策略

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

使用代理IP、Cookies等技巧

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

分布式爬虫的搭建与优化

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

六、Python爬虫框架

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

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

综上所述,Python爬虫通过模拟人类用户访问网页的行为,利用丰富的库支持来获取、解析和存储网页数据,广泛应用于数据采集和数据分析领域。在实际应用中,需遵循合法合规的原则,确保尊重网站隐私政策和使用条款。

 如果你正在学习Python,那么你需要的话可以,点击这里👉Python重磅福利:入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享!或扫描下方CSDN官方微信二维码获娶Python入门&进阶全套学习资料、电子书、软件包、项目源码

 


http://www.mrgr.cn/news/64249.html

相关文章:

  • 适合初学者和专家程序员的 AI 编码工具
  • Cesium着色器
  • 举例说明自然语言处理(NLP)技术。
  • TOEIC 词汇专题:旅游计划篇
  • 线代的几何意义(一)——向量,坐标,矩阵
  • Java学习教程,从入门到精通,Java for-each遍历循环(16)
  • 【刷题13】链表专题
  • 使用WebAssembly优化Web应用性能
  • nodejs入门教程20:nodejs文件系统
  • uniapp-vue3比对筛选
  • 软件测试基础三(前端知识)
  • Elastix-基于ITK的医学图像配准库
  • Java中对象的转移(1)——序列化与反序列化
  • 初探Flink的序列化
  • 手撕快排的三种方法:让面试官对你刮目相看
  • 到底要不要用SAP Screen Personas
  • Unity中的屏幕坐标系
  • Matlab车牌识别课程设计报告模板(附源代码)
  • 【OJ题解】C++实现反转字符串中的每个单词
  • Excel函数CUnique连接合并指定区域的唯一值
  • 远程控制时频繁掉线的原因
  • [每周一更]-(第121期):模拟面试|微服务架构面试思路解析
  • 使用 Faster Whisper 和 Gradio 实现实时语音转文字
  • 2024系统架构师---综合题考试真题答案
  • cangjie仓颉程序设计-程序结构(二)
  • 【含文档】基于ssm+jsp的超市订单后台理系统(含源码+数据库+lw)