Python 爬虫实战:从入门到实战应用
在互联网时代,数据无处不在,而爬虫技术则是获取网络数据的强大工具。Python 的 requests
库因其简洁易用,成为许多爬虫开发者首选的工具之一。本文将通过我的学习笔记,带你深入了解如何使用 Python 的 requests
库进行网络爬虫开发,从基础的请求发送到复杂的数据抓取与保存,一步步掌握爬虫的核心技术。
一、爬虫的基本流程
爬虫的核心流程可以分为以下几个步骤:
- 确定目标网址:明确要爬取的网站地址。
- 模拟浏览器发送请求:通过
requests
库模拟浏览器行为,发送 HTTP 请求并接收响应。 - 解析网页提取数据:使用解析工具(如 BeautifulSoup 或正则表达式)从网页中提取所需数据。
- 保存数据:将提取的数据保存到本地文件(如 CSV、JSON)或数据库中。
二、使用 requests
库发送请求
requests
是 Python 中一个非常强大的 HTTP 库,它可以帮助我们轻松地发送 HTTP 请求。以下是几种常见的请求方式:
(一)GET 请求
GET 请求是最常用的请求方式,用于从服务器获取数据。例如,访问一个网页:
import requests
url = 'https://www.httpbin.org/get'
response = requests.get(url)
print(response.text) # 打印网页源代码
(二)POST 请求
POST 请求通常用于向服务器提交数据。例如,提交表单数据:
data = {
"name": "mark",
"age": 30
}
response = requests.post(url, data=data)
print(response.text)
(三)其他请求方法
除了 GET 和 POST,requests
还支持其他 HTTP 方法,如 DELETE、PUT、HEAD 等:
requests.delete(url)
requests.put(url)
requests.head(url)
三、请求参数与头信息
在实际爬虫开发中,我们常常需要携带额外的参数或设置请求头来模拟真实浏览器的行为。
(一)添加请求参数
通过 params
参数可以向 URL 添加查询参数:
params = {
"name": "mark",
"age": "30"
}
response = requests.get(url, params=params)
print(response.text)
(二)设置请求头
通过 headers
参数可以设置请求头,例如设置用户代理(User-Agent)或 Cookie:
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Cookie": "num=1"
}
response = requests.get(url, headers=headers)
print(response.text)
(三)设置 Cookie
通过 cookies
参数可以直接设置 Cookie:
cookies = {
"num": "1"
}
response = requests.get(url, cookies=cookies)
print(response.text)
(四)设置超时时间
通过 timeout
参数可以设置请求的超时时间:
response = requests.get(url, timeout=0.0000001)
print(response.text)
(五)使用代理
通过 proxies
参数可以设置代理服务器:
proxies = {
"http": "117.42.94.72:22604",
"https": "117.42.94.72:22604"
}
response = requests.get(url, proxies=proxies)
print(response.text)
(六)忽略证书验证
对于 HTTPS 请求,可以通过 verify=False
忽略证书验证:
response = requests.get(url, verify=False)
print(response.text)
(七)携带 JSON 数据
通过 json
参数可以直接发送 JSON 格式的数据:
data = {
"name": "mark"
}
response = requests.post(url, json=data)
print(response.text)
四、解析响应内容
requests
的响应对象提供了多种方法来获取响应内容:
(一)文本内容
通过 response.text
获取响应的文本内容:
print(response.text)
(二)二进制内容
通过 response.content
获取响应的二进制内容,适用于下载图片、文件等:
print(response.content)
(三)JSON 数据
如果响应内容是 JSON 格式,可以通过 response.json()
将其转换为 Python 字典:
data = response.json()
print(data)
(四)状态码与响应头
通过 response.status_code
获取 HTTP 状态码,通过 response.headers
获取响应头:
print(response.status_code)
print(response.headers)
五、实战案例:爬取图片与二手房信息
(一)爬取图片
以下是一个爬取图片的案例,目标是从一个网站下载关键字为“美女”的图片:
import requests
import json
num = 1
for pg in range(0, 241, 24):
url = f'https://www.duitang.com/napi/blogv2/list/by_search/?kw=美女&after_id={pg}&type=feed'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
resp = requests.get(url, headers=headers)
data = resp.json()
pic_list = data['data']['object_list']
for pic in pic_list:
pic_url = pic['photo']['path']
response = requests.get(pic_url)
with open(f'hero/{num}.jpg', 'wb') as f:
f.write(response.content)
print(f'第{num}张图片下载完成')
num += 1
(二)爬取二手房信息
以下是一个爬取链家二手房信息的案例,目标是采集郑州二手房的标题、总价、单价、位置、面积、户型和朝向,并保存到 CSV 文件中:
import csv
import requests
l = []
f = open('lianjia.csv', 'a', encoding='utf-8-sig', newline='')
writer = csv.DictWriter(f, fieldnames=['标题', '总价', '单价', '朝向', '位置', '面积', '户型'])
writer.writeheader()
for pg in range(1, 4):
url = f'https://m.lianjia.com/liverpool/api/ershoufang/getList?cityId=410100&condition=%2Fpg{pg}&curPage={pg}'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
resp = requests.get(url, headers=headers)
data = resp.json()
data_list = data['data']['data']['getErShouFangList']['list']
for i in data_list:
item = {}
item['标题'] = i['title']
item['总价'] = i['totalPrice']
item['单价'] = i['unitPrice']
item['位置'] = i['recoDesc'].split('/')[0]
item['面积'] = i['desc'].split('/')[1]
item['户型'] = i['desc'].split('/')[0]
item['朝向'] = i['desc'].split('/')[2]
l.append(item)
print(item)
writer.writerow(item)
六、总结
通过本文的介绍,我们从基础的 requests
库使用开始,逐步深入到实际的爬虫案例。无论你是初学者还是有一定基础的开发者,都可以通过这些内容快速上手爬虫开发。爬虫技术不仅可以帮助我们获取网络数据,还可以应用于数据分析、机器学习等多个领域。
注意:在进行爬虫开发时,请务必遵守相关法律法规,尊重网站的版权和隐私政策。