动态网页抓取(2.动态网页:不只有代码写出的网页被称为动态)
优采云 发布时间: 2021-10-24 03:02动态网页抓取(2.动态网页:不只有代码写出的网页被称为动态)
T小昂仔 11月26日
版本:python3.7
编程软件:sublime
爬取信息是一个很大的需求,从单个页面、某个站点,到搜索引擎(百度、谷歌)的整个网络爬取。只要人能看到,理论上爬虫就可以获得。不管是静态页面还是动态页面。无论是PC端的页面还是移动端的应用程序都没有关系。爬虫,有很多语言可以选择,python、php、go、java……甚至c。但是现在主流是python作为爬虫的编程语言,因为它好用、高效、省时。
爬取网页信息的python库有很多,urllib、urllib2(不再使用python3)、requests。我们先来比较一下它们的区别:
urllib 和 urllib2 是python的标准库,也就是安装python的话,可以直接使用这两个库;requests是第三方库,不是python基金会实现的,但是功能很强大。
但是urllib和urllib2都是通过url打开资源的。其中,urllib 只能接受 url,而是将请求伪装成 headers。这样写的爬虫发送的请求会直接被很多网站拦截,伪装的不行,需要很复杂的修改,在前面的文章中已经介绍过了。
requests库可以实现urllib和urllib2的所有功能,有它们不具备的优点。在使用过程中,请求更有用。
一:什么是静态网页和动态网页?
1.静态网页:通俗的说,只有HTML格式的网页通常称为静态网页。这些网页的数据比较容易获取,因为所有的数据都显示在网页的HTML代码中。在用python爬取的过程中,有一个强大的Request库,可以方便的发送HTTP请求,方便我们爬取静态网页。
2.动态网页:不仅仅由HTML代码编写的网页称为动态网页。这些网页通常由 CSS、JavaScript 代码和 HTML 代码组成。他们用于通过 Ajax 动态加载网页的数据可能不一定出现在 HTML 中。在代码中,这需要复杂的操作。
二:静态网页抓取
1.要求安装,操作简单
(1)安装
在 cmd 或终端中写入
pip install requests
就是这样。
(2)获取网页内容'
Request最常用的功能是获取网页的内容。我们先来获取上一篇博客的内容:
import requests
rr = requests.get('https://blog.csdn.net/ITxiaoangzai/article/details/83904139')
print("文本编码为:",rr.encoding)
print("响应状态码为:",rr.status_code)
print("内容字符串为:",rr.text)
这样就返回了一个名为rr的响应对象,我们可以调用对应的函数来获取需要的信息。结果如下图所示:
...
以下是一些基本方法:
print(response.status_code) # 打印状态码,200表示请求成功;4xx表示客户端错误;5xx表示服务器错误响应
int(response.url) # 打印请求url
print(response.headers) # 打印头信息
print(response.cookies) # 打印cookie信息
print(response.text) #以文本形式打印网页源码
print(response.content) #以字节流形式打印
您还可以使用 response.json(),它是 Response 中的内置 JSON *敏*感*词*。
2.自定义请求
现在我们可以抓取网页的html代码数据了,但是有时候我们只需要一部分数据,那么我们需要设置Requests的参数来获取我们需要的数据,包括传递URL参数,自定义请求头,发送POST 请求。设置超时等。
这些操作解释如下:
(1)传递 URL 参数
为了请求特定的数据,我们需要在 URL 的查询字符串中添加一些特定的数据。这些数据后面一般都跟一个问号,以键值对的形式放在URL中。
在Request中,我们可以直接将这些参数保存在一个字典中,并使用params将它们构造成URL。
下面是一个例子:
import requests
key_dict = {'one':'value1','two':'value2'}
rr = requests.get('https://blog.csdn.net/ITxiaoangzai/article/details/83904139',params = key_dict)
print("URL正确编码为:",rr.url)
print("字符串方式的响应的内容是:",rr.text)
我们看一下结果:
(2) 自定义请求头
请求标头提供有关请求、响应或其他发送实体的信息。如果没有自定义请求头或请求头与实际网页不一致,可能返回不正确的结果。请求不会根据自定义的请求标头改变其行为。只有在最后的请求中,才会传入请求头信息。
我们可以按照下面的方法找到正确的请求头:
打开上一篇博客的内容:
然后我们右键,选择检查(有些浏览器也叫检查元素),然后选择网络选项:
当我们选择python的图片时,会发现在左边的资源栏中截取了一个文件,即图片文件。我们可以在Header中看到Request Headers的详细信息(其实在之前的博客中已经介绍过了),这里只需要提取请求头的重要部分,即user-agent部分:
然后我们将我们自定义的请求头添加到 requests.get() 函数中:
import requests
headers = {
'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400',
'Host' : 'https://img-blog.csdn.net/20180716181513532?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUeGlhb2FuZ3phaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70'
}
r = requests.get('https://blog.csdn.net/ITxiaoangzai/article/details/83904139',headers = headers)
print("字符串方式的响应的内容是:",r.text)
print("响应码为:",r.status_code)
结果如下:
这里返回的响应码是 400 表示我们的代码是错误的。这说明我们不能使用这种方法来抓取图像。关于如何正确抓取图片,我会在下面的文章中和大家聊一聊。
3.发送POST请求
除了GET请求,有时还需要发送一些以表单形式编码的数据。这时候只需要给Request中的data参数传递一个字典,这些数据字典会在发送请求的时候自动编码到表单中。我们之前在爬有道词典的文章中使用了这个请求。
4.超时
可以使用Requests设置超时参数,如果在指定时间内没有响应则抛出异常。
三:豆瓣前100电影片名爬取示例
先打开网址
然后我们找到每部电影的HTML代码:
在这里,我们需要的信息在
发现只有start=""后面的区别,我们可以分析四次,或者循环进行:
import requests
from bs4 import BeautifulSoup
def getUrl():
headers = {
'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400',
}
for i in range(0,4):
url = "https://www.douban.com/doulist/36513321/?start={}&sort=seq&playable=0&sub_type=".format(i*25)
list = []
r = requests.get(url,headers = headers)
soup = BeautifulSoup(r.text,"html.parser")
thisUrl = soup.find_all('div',class_ = "title")
for each in thisUrl:
everyUrl = each.text.strip()
list.append(everyUrl)
print(list)
print("响应码为:",r.status_code)
def main():
getUrl()
if __name__ == '__main__':
main()
这里我们用format()格式化字符串(这里也可以用%格式化字符串),看看结果:
在这里我们看到我们已经成功爬取到了我们想要的内容。