主要目录包括
1.静态页面与动态页面的区别
2.requests包的用法
3.小小爬虫实例(爬取百度翻译)
一.静态页面与动态页面的区别
在最最开始学习爬虫的时候,我就不太懂,为什么有的页面可以直接获取,有的还需要去控制台的网络模块抓包。取决于是动态页面还是静态页面啦!
静态网页
静态网页是标准的 HTML 文件,通过 GET 请求方法可以直接获取,文件的扩展名是.html
、.htm
等,网面中可以包含文本、图像、声音、FLASH 动画、客户端脚本和其他插件程序等。静态网页是网站建设的基础,早期的网站一般都是由静态网页制作的。静态并非静止不动,它也包含一些动画效果,这一点不要误解。
我们知道,当网站信息量较大的时,网页的生成速度会降低,由于静态网页的内容相对固定,且不需要连接后台数据库,因此响应速度非常快。但静态网页更新比较麻烦,每次更新都需要重新加载整个网页。
静态网页的数据全部包含在 HTML 中,因此爬虫程序可以直接在 HTML 中提取数据。通过分析静态网页的 URL,并找到 URL 查询参数的变化规律,就可以实现页面抓取。与动态网页相比,并且静态网页对搜索引擎更加友好,有利于搜索引擎收录。
动态网页
动态网页指的是采用了动态网页技术的页面,比如 AJAX(是指一种创建交互式、快速动态网页应用的网页开发技术)、ASP(是一种创建动态交互式网页并建立强大的 web 应用程序)、JSP(是 Java 语言创建动态网页的技术标准) 等技术,它不需要重新加载整个页面内容,就可以实现网页的局部更新。
动态页面使用“动态页面技术”与服务器进行少量的数据交换,从而实现了网页的异步加载。
如下图所示(这样需要右键打开控制台,并且点击网络)
滚动鼠标滑轮时,网页会从服务器数据库自动加载数据并渲染页面,这是动态网页和静态网页最基本的区别。抓取动态网页的过程较为复杂,需要通过动态抓包来获取客户端与服务器交互的 JSON 数据。
二.requests包
之前爬虫还会用到urllib包,不过这个包用起来比较复杂,有点老,现在一般不用,大多用requests包。
Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。
requests 模块比 urllib 模块更简洁。
使用 requests 发送 HTTP 请求需要先导入 requests 模块:
在此之前需要先
pip install request这个包
然后
import requests
导入后就可以发送 HTTP 请求,使用 requests 提供的方法向指定 URL 发送 HTTP 请求,例如:
import requests
x=requests.get('http://www.baidu.com')
x.encoding='utf-8'
print(x.text)
每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息,如状态码、响应头、响应内容;
一些常用属性和方法
close() | 关闭与服务器的连接 |
content | 返回响应的内容,以字节为单位 |
cookies | 返回一个 CookieJar 对象,包含了从服务器发回的 cookie |
encoding | 解码 r.text 的编码方式 |
headers | 返回响应头,字典格式 |
json() | 返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误) |
text | 返回响应的内容,unicode 类型数据 |
url | 返回响应的 URL |
status_code | 返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found) |
requests 方法
delete(url, args) | 发送 DELETE 请求到指定 url |
get(url, params, args) | 发送 GET 请求到指定 url |
head(url, args) | 发送 HEAD 请求到指定 url |
patch(url, data, args) | 发送 PATCH 请求到指定 url |
post(url, data, json, args) | 发送 POST 请求到指定 url |
put(url, data, args) | 发送 PUT 请求到指定 url |
request(method, url, args) | 向指定的 url 发送指定的请求方法 |
1) requests.get()
该方法用于 GET 请求,表示向网站发起请求,获取页面响应对象。语法如下:
res = requests.get(url,headers=headers,params,timeout)
参数说明如下:
- url:要抓取的 url 地址。
- headers:用于包装请求头信息。
- params:请求时携带的查询字符串参数。
- timeout:超时时间,超过时间会抛出异常。
(2)requests.post() 方法可以发送 POST 请求到指定 url,一般格式如下:
requests.post(url, data={key: value}, json={key: value}, args)
-
url 请求 url。
-
data 参数为要发送到指定 url 的字典、元组列表、字节或文件对象。
-
json 参数为要发送到指定 url 的 JSON 对象。
-
args 为其他参数,比如 cookies、headers、verify等。
以上两种比较常用
三.实战一下吧(百度翻译)
打开百度翻译网站(https://fanyi.baidu.com)
按照惯例导入requests包,因为这里要给网页一个信息他才会反馈信息回来,所以采用post方法
我们的目的就是获取下面翻译后的内容
以下是控制台页面,可以右键点击检查后获得,或者F12
因为是动态的,我们点击网络后,重新抓包(刷新页面或者输入搜索信息)
我们找到预览中显示结果的包,获取他的URL做为我们访问的URL
通过负载可以看到传给网页的数据是字典格式,模仿一下:(kw:dog)
最后代码如下:
import requests
url="https://fanyi.baidu.com/sug"
data={
'kw':input("请输入一个你想搜索的单词")#在浏览器里面找
}
resp=requests.post(url,data=data)
# resp.encoding='utf-8'如果汉语是乱码可以加这一句
# print(resp.text)
#如果返回内容是json,可以直接resp.json()
print(resp.json())
结果展示
这个小箭头可以帮助你在控制台自动换行哦