
Python爬虫开发
一、爬虫基础概念
什么是爬虫?
自动化程序,模拟浏览器行为,从网页中提取目标数据。
应用场景:搜索引擎、数据分析、价格监控等。
法律与道德
遵守目标网站的
robots.txt
协议(如禁止爬取的路径)。避免高频访问导致服务器压力,尊重隐私和数据版权。
二、核心技术与库
1. HTTP请求
库:
requests
(推荐)、urllib
关键点:
GET/POST请求方法
请求头(Headers):
User-Agent
,Cookie
,Referer
响应状态码(200成功,404未找到等)
import requests headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get('https://example.com', headers=headers) print(response.text) # 获取HTML内容
2. 解析HTML
库:
BeautifulSoup
(简单易用)、lxml
(高效)、re
(正则表达式)示例:
from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') titles = soup.find_all('h1', class_='title')
3. 动态页面处理
库:
Selenium
(模拟浏览器)、Playwright
(更现代化)适用场景:JavaScript渲染的页面(如单页应用SPA)。
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://example.com') content = driver.page_source
4. 数据存储
文本文件(
.txt
,.csv
,.json
)数据库:
sqlite3
(轻量)、MySQL
、MongoDB
示例(CSV):
import csv with open('data.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['标题', '价格'])
三、反爬机制与应对
常见反爬手段
User-Agent检测、IP封禁、验证码、动态参数(如Token)。
应对策略
设置随机User-Agent:使用
fake_useragent
库。使用代理IP:通过服务商或自建代理池。
延迟请求:
time.sleep(random.uniform(1,3))
处理验证码:OCR识别(如
pytesseract
)或第三方打码平台。
四、Scrapy框架
优势:异步处理、中间件扩展、自动化管道。
快速入门:
安装:
pip install scrapy
创建项目:
scrapy startproject project_name
编写Spider:
import scrapy class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['https://example.com'] def parse(self, response): title = response.css('h1::text').get() yield {'title': title}
五、实战案例
案例1:爬取豆瓣电影Top250
import requests
from bs4 import BeautifulSoup
url = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
for movie in soup.select('.item'):
title = movie.select_one('.title').text
rating = movie.select_one('.rating_num').text
print(f'电影:{title},评分:{rating}')
案例2:动态页面爬取(使用Selenium)
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.jd.com/search?q=手机')
products = driver.find_elements(By.CSS_SELECTOR, '.gl-item')
for product in products:
name = product.find_element(By.CSS_SELECTOR, '.p-name').text
price = product.find_element(By.CSS_SELECTOR, '.p-price').text
print(f'商品:{name},价格:{price}')
driver.quit()
六、完整例子
# 爬虫
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
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'}
def get_html():
url = 'https://www.baidu.com'
response = requests.get(url, headers=headers)
# print(response.text) # 打印网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# print(soup.prettify()) # 打印网页内容格式化后
print(soup.title) # 打印网页标题
# 使用find_all方法找到所有a标签
# hrefs = soup.find_all('a', class_='text-color') # 找到所有链接
# for href in hrefs:
# print(href['href'], href.text) # 打印链接地址
# 直接使用CSS选择器
hrefs = soup.select('a.text-color') # 找到所有链接
for href in hrefs:
print(href['href'], href.text)
# 使用 webdriver-manager 自动管理驱动
# pip install webdriver-manager
# 定义一个函数,使用selenium获取网页源代码
def get_html_selenium():
# 使用ChromeDriverManager安装ChromeDriver
service = Service(ChromeDriverManager().install())
# 使用ChromeDriver创建一个webdriver对象
driver = webdriver.Chrome(service=service)
try:
# 打开百度网页
driver.get('https://www.baidu.com')
# 打印网页源代码
print(driver.page_source)
finally:
# 关闭webdriver对象
driver.quit()
if __name__ == "__main__":
# get_html()
get_html_selenium()
七、注意事项
频率控制:添加延时(如
time.sleep(2)
),避免被封IP。异常处理:捕获
requests.exceptions
中的超时、连接错误。数据清洗:去除HTML标签、处理编码问题(
response.encoding = 'utf-8'
)。
通过以上步骤,你可以掌握Python爬虫的核心技术。如需更深入学习,可探索分布式爬虫(Scrapy-Redis)或逆向工程(如破解加密API参数)。