【Python爬虫】爬虫原理与生态:从HTTP协议到技术栈全景
HTTP(超文本传输协议)是互联网数据传输的基石,客户端通过它向服务器发送请求,服务器返回响应。HTTPS则是HTTP的安全版本,通过SSL/TLS加密通信,确保数据隐私和完整性。爬虫开发者必须深入理解这两者,因为它们是与网页交互的核心。
HTTP通信由请求和响应组成。请求包括方法(如GET、POST)、URL、头信息和可选的消息体;响应包含状态码(如200、404)、头信息和数据。以下是常见的状态码和方法:
GET:获取资源,常用于爬取网页。
POST:提交数据,如登录表单。
状态码:
HTTPS通过加密防止中间人攻击,爬虫需正确处理证书验证,避免因安全设置导致的访问失败。对于HTTPS流量的调试,开发者可以使用抓包工具如 SniffMaster,它提供HTTPS暴力抓包功能,支持在无需代理、越狱或root的情况下解密HTTPS流量,方便查看加密通信内容。
HTTP头携带额外信息,影响爬虫行为。以下是关键头字段:
爬虫常需伪装成浏览器,设置合理的头信息。例如:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124',
'Accept': 'text/html,application/xhtml+xml'
}
response = requests.get('https://example.com', headers=headers)
print(response.status_code) # 输出:200
图示:请求-响应流程
客户端 服务器 | | | | <--响应
Cookie和Session用于状态管理,尤其在需要登录的爬取任务中。
Set-Cookie 头发送,客户端在后续请求中携带。用于跟踪用户身份。爬虫需模拟这一过程。例如,使用
requests.Session 保持会话:
import requests
session = requests.Session()
login_data = {'username': 'user', 'password': 'pass'}
session.post('https://example.com/login', data=login_data)
# 后续请求自动携带Cookie
response = session.get('https://example.com/profile')
print(response.text)
注意:某些网站使用加密Cookie,需分析其生成逻辑。
爬虫涉及法律风险,尤其在处理个人信息时。以下是关键法规:
GDPR(欧盟通用数据保护条例):
CCPA(加州消费者隐私法案):类似GDPR,适用于美国加州。
爬虫开发者应:
案例:2019年,某爬虫公司因未遵守GDPR被罚款,教训是合规优先。
Robots.txt是网站与爬虫的“君子协定”,位于根目录(如
https://example.com/robots.txt)。它指定允许或禁止抓取的路径。
示例:
User-agent: * Disallow: /admin/ Allow: /public/
User-agent: *:适用于所有爬虫。Disallow:禁止访问。Python解析示例:
from urllib import robotparser
rp = robotparser.RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
print(rp.can_fetch('*', 'https://example.com/admin/page')) # 输出:False
注意:不遵守Robots.txt可能导致IP封禁或法律诉讼。
Requests是轻量级HTTP工具,适合简单任务。
import requests
response = requests.get('https://api.example.com/data')
data = response.json()
print(data)
Scrapy是为大规模爬取设计的异步框架。
Spider示例:
import scrapy
class BlogSpider(scrapy.Spider):
name = 'blogspider'
start_urls = ['https://example.com']
def parse(self, response):
titles = response.css('h1::text').getall()
for title in titles:
yield {'title': title}
运行:
scrapy crawl blogspider -o output.json
Selenium模拟浏览器,适合动态网页。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://example.com')
content = driver.page_source
print(content)
driver.quit()
工具场景优点缺点RequestsAPI、静态网页简单快速无动态支持Scrapy大规模结构化抓取异步、高效学习成本高Selenium动态网页、交互真实浏览器模拟性能低
选择建议:
CSS选择器定位元素,直观高效。
from bs4 import BeautifulSoup
html = '<div class="item"><p>Text</p></div>'
soup = BeautifulSoup(html, 'html.parser')
print(soup.select_one('.item p').text) # 输出:Text
XPath更灵活,适合复杂结构。
from lxml import etree
html = '<div class="item"><p>Text</p></div>'
tree = etree.HTML(html)
print(tree.xpath('//div[@class="item"]/p/text()')[0]) # 输出:Text
正则适用于非结构化数据。
import re
text = 'Contact: 123-456-7890'
phone = re.search(r'\d{3}-\d{3}-\d{4}', text).group()
print(phone)
import requests
import random
import time
proxies = {'http': 'http://proxy1', 'https': 'http://proxy2'}
response = requests.get('https://example.com', proxies=proxies)
time.sleep(random.uniform(1, 5))
抓包工具SniffMaster的代理抓包模式可以帮助监控这些代理请求,实现请求分组和拦截,通过JavaScript脚本修改请求或响应,进一步优化爬虫策略。
import random
from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random}
response = requests.get('https://example.com', headers=headers)
Scrapy内置异步支持,也可用
aiohttp:
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.text()
async def main():
tasks = [fetch('https://example.com') for _ in range(10)]
await asyncio.gather(*tasks)
asyncio.run(main())
使用
Scrapy-Redis 实现分布式。
from pybloom_live import BloomFilter bf = BloomFilter(capacity=10000, error_rate=0.001) url = 'https://example.com' if url not in bf: bf.add(url)
网络爬虫技术丰富多样,从HTTP基础到法律合规,再到工具选择,开发者需全面掌握。本文通过代码和分析展示了核心内容,希望你能从中获益并开启自己的爬虫项目。始终记住:技术无界,合规先行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70046795/viewspace-3179246/ ,如需转载,请注明出处,否则将追究法律责任。