网页中flash数据抓取(定制Requests有些网页的获取请求方法及注意事项!!)
优采云 发布时间: 2022-03-02 15:14网页中flash数据抓取(定制Requests有些网页的获取请求方法及注意事项!!)
内容
在网站的设计中,纯HTML格式的网页通常被称为静态网页,早期的网站一般都是由静态网页构成。在静态网页抓取中,有一个强大的 Requests 库,可让您轻松发送 HTTP 请求。
1 获取响应内容
在Requests中,常用的功能是获取网页的内容。
import requests
r = requests.get('https://www.baidu.com/')
print("文本编码:", r.encoding)
print("响应状态码:", r.status_code)
print("字符串方式的响应体:", r.text)
笔记:
2 自定义请求
有些网页需要设置Requests的参数来获取需要的数据,包括传递URL参数、自定义请求头、发送POST请求、设置超时时间等。
2.1 传递URL参数
为了请求特定的数据,我们需要在 URL 的查询字符串中收录一些数据。如果您自己构建 URL,则数据通常后跟一个问号,并作为键/值放置在 URL 中。
在 Requests 中,这些参数可以直接存储在字典中,并通过 params(参数)内置到 URL 中。
import requests
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=key_dict)
print("URL已经正确编码:", r.url)
print("字符串方式的响应体:\n", r.text)
2.2 自定义请求头
请求标头标头提供有关请求、响应或其他发送实体的信息。对于爬虫来说,请求头非常重要。如果未指定请求头或请求的请求头与实际网页不一致,则可能无法返回正确的结果。
请求不会根据自定义请求头的具体情况改变其行为,但在最终请求中,所有请求头都会被传入。
如何获取请求标头:
使用 Chrome 的“检查”命令。使用Chrome浏览器打开要请求的网页,在网页任意位置单击鼠标右键,在弹出的快捷菜单中点击“检查”命令。
在打开的页面中单击网络选项。
图 1 单击网络选项
在左侧的请求资源中找到您需要请求的网页,(如果没有,请点击网页左上角的刷新按钮),以本例为例。点击要请求的网页,可以在Headers中看到Requests Headers的详细信息。
图2 找到需要请求的网页的头部信息
因此,我们可以看到请求头中的信息是:
图3 请求网页的头部信息
要提取请求标头的重要部分,您可以将代码更改为:
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
'Host': 'www.santostang.com'}
r = requests.get('http://www.santostang.com/', headers=headers)
print("响应状态码:", r.status_code)
2.3 发送 POST 请求
除了 GET 请求之外,有时还需要发送一些以表单形式编码的数据。比如登录的时候,请求是POST,因为如果使用GET请求,会在URL中显示密码,非常不安全。如果要实现 POST 请求,只需将字典传递给 Requests 中的 data 参数,请求时数据字典会自动编码为表单。
可以看到,form变量的值就是key_dict中输入的值,所以POST请求发送成功。
2.4 超时
有时,爬虫遇到服务器很长时间不返回,这意味着爬虫程序会一直等待,导致爬虫程序执行不顺畅。因此,可以使用 Requests 在 timeout 参数设置的秒数过去后停止等待响应。
import requests
link = "http://www.santostang.com/"
r = requests.get(link, timeout=0.001)
3 请求爬虫实践:TOP250电影数据
本次项目的目的是获取豆瓣电影Top 250中所有电影的名称。网址是:豆瓣电影Top 250。在这个爬虫中,请求头是根据实际浏览器定制的。
3.1 网站分析
按照2.2中的方法提取重要的请求头。
第一页只有 25 部电影,如果要获取全部 250 部电影,则需要获取总共 10 页的内容。
通过点击第二页,可以发现页码地址变成了
点击第三页发现页码地址是
即每增加一个页面,网页地址的起始参数加25。
3.2 项目实战
通过以上分析可以发现,使用requests获取电影网页的代码,并使用for循环进行翻页,代码如下:
import requests
def get_movies():
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
'Host': 'movie.douban.com'}
for i in range(0, 10):
link = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='
r = requests.get(link, headers=headers, timeout=10)
print('第', str(i + 1), '页响应状态码: ', r.status_code)
print(r.text)
get_movies()
运行上面的代码,结果是:page 1 response status code: 200
这时得到了生成的知识网页的HTML代码,我们需要从中提取出想要的电影名称。代码如下:
import requests
from bs4 import BeautifulSoup
def get_movies():
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
'Host': 'movie.douban.com'}
movie_list = []
for i in range(0, 10):
link = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='
r = requests.get(link, headers=headers, timeout=10)
print('第', str(i + 1), '页响应状态码: ', r.status_code)
soup = BeautifulSoup(r.text, 'lxml')
div_list = soup.find_all('div', class_='hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print(movies)
参考
[1] 唐松.2019.Python网络爬虫从入门到实践(第2版)[M]. 北京:机械工业出版社