Python学习第二十一天
爬虫
概念
网络爬虫(Web Crawler),也称为网络蜘蛛(Web Spider),是一种自动化程序,用于从互联网上抓取数据。爬虫通过模拟浏览器行为,访问目标网站并提取所需的信息,然后将这些信息存储或进一步处理。例如我们常见的12306网站为什么总是票没有,它每天遭受的请求成百上千万次,还有天气,一些组件比如手表上的天气怎么获取的也是根据爬虫获取到的。
理解
-
工作原理:
-
发送请求:爬虫向目标网站发送 HTTP 请求(通常是 GET 或 POST 请求),获取网页的 HTML 内容。
-
解析内容:使用解析库(如
BeautifulSoup
、lxml
)解析 HTML,提取所需的数据(如文本、链接、图片等)。 -
存储数据:将提取的数据保存到本地文件(如 CSV、JSON、数据库)或进行进一步处理。
-
遍历链接:通过提取的链接,递归地访问其他页面,实现自动化抓取。
-
-
核心组件:
-
请求库:如
requests
、aiohttp
,用于发送 HTTP 请求。 -
解析库:如
BeautifulSoup
、lxml
、pyquery
,用于解析 HTML 或 XML。 -
存储模块:如
csv
、json
、pymysql
,用于存储数据。 -
调度器:用于管理爬虫的抓取顺序和频率。
-
反爬虫处理:如设置请求头、使用代理 IP、模拟登录等。
-
-
爬虫的分类:
-
通用爬虫:如搜索引擎的爬虫,抓取整个互联网的内容。
-
聚焦爬虫:针对特定网站或特定内容进行抓取。
-
增量式爬虫:只抓取网站更新的内容。
-
深层爬虫:抓取需要登录或动态加载的内容。
-
用途
爬虫的应用非常广泛,以下是一些常见的用途:
-
数据采集:
-
抓取商品价格、新闻、社交媒体内容等。
-
用于市场调研、竞品分析、舆情监控等。
-
-
搜索引擎:
-
搜索引擎(如 Google、百度)使用爬虫抓取网页内容,建立索引。
-
-
数据分析:
-
抓取大量数据后,进行数据清洗、分析和可视化。
-
例如,抓取股票数据并进行分析预测。
-
-
自动化任务:
-
自动抓取天气、航班、电影排期等信息。
-
自动填写表单、提交数据。
-
-
机器学习:
-
抓取数据用于训练机器学习模型。
-
例如,抓取图片用于图像识别模型。
-
-
学术研究:
-
抓取学术论文、专利、文献等数据。
-
-
内容聚合:
-
抓取多个网站的内容,整合到一个平台。
-
例如,新闻聚合网站。
-
合法性
爬虫的使用需要遵守相关法律法规和网站的爬取规则:
-
遵守 Robots 协议:在爬取网站前,检查
robots.txt
文件,确保爬虫行为符合网站的规则。 -
避免对网站造成负担:设置合理的请求频率,避免对目标网站的服务器造成过大压力。
-
尊重隐私和数据安全:不要抓取敏感信息或侵犯用户隐私。
-
遵守版权法:抓取的内容不能用于商业用途,除非获得授权。
常用工具和框架
-
基础库:
-
requests
:发送 HTTP 请求。 -
BeautifulSoup
:解析 HTML。 -
lxml
:高性能的 HTML/XML 解析库。 -
re
:正则表达式,用于提取复杂文本(前面学习过了 一个看下正则获取内容)。
-
-
进阶工具:
-
Selenium
:模拟浏览器行为,适用于动态加载的网页。 -
Pyppeteer
:基于 Chromium 的无头浏览器。 -
aiohttp
:异步 HTTP 请求库,提高爬虫效率。
-
-
框架:
-
Scrapy
:强大的爬虫框架,支持分布式爬取、数据管道等功能。 -
PySpider
:分布式爬虫框架,适合大规模数据抓取。
-
挑战
-
反爬虫机制:
-
IP 封禁、验证码、动态加载、请求频率限制等。
-
解决方法:使用代理 IP、设置请求头、模拟登录、降低请求频率。
-
-
动态内容:
-
一些网站使用 JavaScript 动态加载内容。
-
解决方法:使用
Selenium
或Pyppeteer
模拟浏览器行为。
-
-
数据清洗:
-
抓取的数据可能包含噪声或无效信息。
-
解决方法:使用正则表达式、数据清洗工具(如
pandas
)。
-
-
法律风险:
-
爬虫可能违反网站的使用条款或相关法律。
-
解决方法:遵守法律法规,获取授权。
-
第一个程序
使用Beautiful Soup来完成第一个程序。
概念
官方概念:Beautiful Soup是一个 可以从 HTML 或 XML 文件中提取数据的 Python 库。它能用你喜欢的解析器和习惯的方式实现 文档树的导航、查找、和修改。它会帮你节省数小时甚至数天的工作时间。
安装
# 需要requests 来配合使用
pip install beautifulsoup4 requests
使用
import requests
from bs4 import BeautifulSoup
# 发送HTTP请求 使用requests来获取百度的
url = 'https://www.baidu.com'
response = requests.get(url)
# 设置编码
response.encoding = 'utf-8'
# 检查请求是否成功
if response.status_code == 200:
# print(response.text)
# 解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')
# print('html内容为: %s' % soup)
# 提取数据
title = soup.title.string
print(f'网页标题: {title}')
# 提取所有链接
for link in soup.find_all('a'):
print(link.get('href'))
else:
print(f'请求失败,状态码: {response.status_code}')