Python 中的 requests 模块是一个简单易用的 HTTP 库,它能够帮助我们完成各种HTTP请求,并获取服务端数据。在实现静态网页爬虫时,我们可以直接获取网页 HTML 代码,但是如果网页通过 Ajax 等技术动态加载数据,我们就需要使用 requests 模块来模拟浏览器向服务端发送请求并获取响应。
下面是实现动态网页爬虫的完整攻略:
1. 安装 requests 模块
在终端中执行以下命令即可安装:
pip install requests
2. 获取数据
通过 requests 模块发送 GET 请求,获取服务端响应,并获取所需数据。
import requests
url = 'https://example.com/data'
r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
response = r.json()
上述代码中,我们通过 requests.get 方法发送了一个 GET 请求并传递了 headers 信息,这个 headers 信息会告诉服务端我们是使用浏览器进行请求的。服务端响应数据是以 JSON 格式返回的,所以我们直接调用 r.json() 来解析响应,获取所需数据。
3. 跳过 CSRF 验证
有些网站为了防止跨站请求伪造(CSRF)攻击,会要求在请求中携带 token 信息,如果不携带则会报错。这时我们需要跳过CSRF 验证,方法如下:
import requests
url = 'https://example.com/data'
headers = {
'User-Agent': 'Mozilla/5.0',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'https://example.com'
}
cookies = {
'csrftoken': 'xxxx'
}
r = requests.get(url, headers=headers, cookies=cookies)
response = r.json()
在 headers 中传递 X-Requested-With 和 Referer 信息,同时在 cookies 中传递 csrftoken,这样你就可以跳过 CSRF 验证,正常获取数据。
示例
下面以豆瓣电影 TOP250 为例,展示如何使用 requests 模块实现动态网页爬虫:
import requests
from bs4 import BeautifulSoup
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0'
}
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
items = soup.find_all('div', class_='item')
for item in items:
title = item.find('span', class_='title').text
rating = item.find('span', class_='rating_num').text
print('电影名称:{},评分:{}'.format(title, rating))
上述代码使用 requests 模块发送 GET 请求,获取豆瓣电影 TOP250 的页面 HTML 代码,使用 BeautifulSoup 解析 HTML 代码,并获取电影名称和评分。
另外一个示例是通过 requests 实现在 GitHub 上搜索某个关键词,并获取前 10 个搜索结果:
import requests
from bs4 import BeautifulSoup
url = 'https://github.com/search'
headers = {
'User-Agent': 'Mozilla/5.0'
}
params = {
'q': 'python',
'type': 'Repositories'
}
r = requests.get(url, headers=headers, params=params)
soup = BeautifulSoup(r.text, 'html.parser')
items = soup.find_all('li', class_='repo-list-item')
for item in items[:10]:
name = item.find('a', class_='v-align-middle').text.strip()
desc = item.find('p', class_='mb-1').text.strip()
link = item.find('a', class_='v-align-middle')['href']
print('名称:{},简介:{},链接:{}'.format(name, desc, link))
上述代码使用 requests 模块发送 GET 请求,并传递了 params 参数来搜索 GitHub 上与关键字 python 相关的仓库,使用 BeautifulSoup 解析 HTML 代码,并获取仓库名称、简介和链接信息。最后打印出前 10 个搜索结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python用requests模块实现动态网页爬虫 - Python技术站