Python爬虫入门教程:从零基础到抓取数据
一、什么是网络爬虫?
网络爬虫(Web Crawler),也称为网络蜘蛛(Web Spider),是一种按照一定的规则,自动抓取万维网信息的程序或者脚本。它能够模拟人类在浏览器中的操作,自动访问网页,提取所需的数据,广泛应用于数据采集、搜索引擎优化、市场调研等领域。
但在编写爬虫时,务必遵守法律法规和网站的robots.txt协议,避免过度抓取对网站造成负担,同时不要非法获取隐私数据。
二、环境准备
1. Python安装:确保你已经安装了Python,建议使用Python 3.6及以上版本。可以从Python官方网站(https://www.python.org/downloads/)下载并安装。
2. 安装必要的库:
◦ requests:用于发送HTTP请求,获取网页内容。
◦ BeautifulSoup:用于解析HTML和XML文档,方便提取数据。
◦ lxml:高效的XML和HTML解析器,BeautifulSoup可以与其配合使用,提升解析效率。
使用以下命令安装这些库:
pip install requests beautifulsoup4 lxml
三、发送HTTP请求获取网页内容
使用requests库发送HTTP请求是爬虫的第一步。下面是一个简单的示例,获取百度首页的内容:
import requests
url = "https://www.baidu.com"
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
# 设置响应的编码方式,避免中文乱码
response.encoding = 'utf-8'
print(response.text)
else:
print(f"请求失败,状态码: {response.status_code}")
在上述代码中:
1. 使用requests.get()方法发送GET请求,获取网页内容。
2. 通过response.status_code检查请求是否成功,200表示成功。
3. 设置response.encoding为utf-8,确保正确显示中文内容。
四、解析网页内容
获取网页内容后,需要解析HTML文档来提取我们需要的数据。这里介绍使用BeautifulSoup库进行解析。
from bs4 import BeautifulSoup
import requests
url = "https://www.example.com" # 替换为实际网址
response = requests.get(url)
if response.status_code == 200:
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml')
# 提取所有的标签
links = soup.find_all('a')
for link in links:
print(link.get('href'))
else:
print(f"请求失败,状态码: {response.status_code}")
在上述代码中:
1. 使用BeautifulSoup()方法创建一个BeautifulSoup对象,传入网页内容和解析器(这里使用lxml)。
2. 通过find_all()方法查找所有的标签,并使用get('href')获取链接的href属性值。
除了find_all(),BeautifulSoup还提供了其他查找方法,如find()(查找第一个匹配的元素)、select()(通过CSS选择器查找元素)等。例如,使用select()方法查找所有类名为article的元素:
articles = soup.select('.article')
五、实战案例:抓取豆瓣电影Top250
下面以抓取豆瓣电影Top250的电影名称、评分和评价人数为例,展示完整的爬虫流程:
import requests
from bs4 import BeautifulSoup
def get_movie_info():
base_url = "https://movie.douban.com/top250"
movie_list = []
for start in range(0, 250, 25):
params = {
"start": start,
"filter": ""
}
response = requests.get(base_url, params=params)
if response.status_code == 200:
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml')
movies = soup.find_all('div', class_='item')
for movie in movies:
title = movie.find('span', class_='title').text
rating_num = movie.find('span', class_='rating_num').text
num_comments = movie.find('span', class_='pl').text.strip('人评价')
movie_list.append({
"title": title,
"rating_num": rating_num,
"num_comments": num_comments
})
else:
print(f"请求失败,状态码: {response.status_code}")
return movie_list
if __name__ == "__main__":
movie_info = get_movie_info()
for movie in movie_info:
print(movie)
在这个案例中:
1. 使用requests.get()方法发送带参数的请求,通过params传递分页参数。
2. 使用BeautifulSoup解析网页,通过find_all()和find()方法定位并提取电影名称、评分和评价人数。
3. 将提取的数据存储在列表中并返回。
六、处理反爬机制
许多网站会设置反爬机制,防止被过度抓取。常见的反爬手段及应对方法如下:
1. User-Agent检测:网站通过检查请求头中的User-Agent字段识别爬虫。可以在请求头中设置模拟浏览器的User-Agent:
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"
}
response = requests.get(url, headers=headers)
2. IP封禁:如果同一个IP频繁请求,可能会被封禁。可以使用代理IP来切换请求IP。
proxies = {
"http": "http://your_proxy_ip:port",
"https": "https://your_proxy_ip:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
3. 验证码:对于复杂的验证码,可能需要使用OCR技术(光学字符识别)或人工识别服务来处理。
七、总结
通过以上步骤,你已经掌握了Python爬虫的基本原理和操作方法。但爬虫开发是一个不断学习和实践的过程,后续还可以学习使用更强大的爬虫框架(如Scrapy)、处理动态网页(使用Selenium结合ChromeDriver)等进阶内容。记住,在使用爬虫时一定要合法合规,尊重网站的使用条款和用户隐私。