目录
一,网页开发者工具的使用
二、通过python发送请求
(一)、get
(二)、带参数的get
(三)、post
后续:数据解析
一,网页开发者工具的使用
我们可以用 requests 库来从一个url或者说一个网址来爬取资源,这里以百度主页和windows初始浏览器Microsoft Edge为例,我们进入百度主页后按F12进入开发者模式,我们常用的功能是元素和网络,源代码除了反爬反加密外很少用。元素显示的是当前页面的实时代码,网络则是能看到打开工具后当前网页的所有请求。
在弹出的开发者界面中选择网络,然后刷新一下页面,可以看到工具抓取了很多请求,我们选中第一个请求。其中,标头就是网络传输时,http协议规定的格式。
常规里包含了目标url,请求方法,是我们着重需要看的地方。请求标头中要注意的有Cookie、Referer、User-Agent。Cookie主要用于管理登录状态、验证自动登录,在一些登录的地方需要使用,Referer指从哪个网址发起请求的,可能和反爬有关。User-Agent则是表示了请求是从什么设备(操作系统,浏览器信息)发出的,一些网站会验证设备信息反爬。
响应就是服务器对这回请求发送的回信,往往就是我们需要的数据。预览是返回数据的可视化,一般如网页、图片或者代码就能显示预览。
很多请求还具有负载,其实就是get请求时附带的参数或者post请求附带的数据。
二、通过python发送请求
常见的请求方式有get和post,其中,get是向服务器请求资源,一般的访问资源都是get。post会向服务器提交数据,像是百度翻译的待翻译文本提交就是post。而向一个网页提出请求是用get还是post具体就看上面标头中的请求方法。
(一)、get
现在我们就试试下载百度主页吧。
import requests
url = "https://www.baidu.com"
headers = {
# 用户代理,某些网站验证用户代理,微微改一下,如果提示要验证码之类的,使用它
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome"
"/118.0.0.0 Safari/537.36",
}
with requests.get(url=url,headers=headers) as resp:
resp.encoding = "utf-8" # 当页面乱码改这里
print(resp)
with open("baidu.html", mode="w", encoding="utf-8") as f: # 下载源码
f.write(resp.text)
不加 headers也是可以的,但请求到的东西会有差异,某些网站甚至会无视请求或者要求验证码,因为python默认的headers如下,相当于告诉网站我是python。
with作用是执行完毕后自动执行resp.close()关闭链接
下载文件结果如下,没有百度图片是因为图片在其他请求中获得。
(二)、带参数的get
接下来我们试试下载这个网页:(为什么不用百度,因为百度搜出来第二条结果过不了审,而且搜狗参数少点,但原理一样)
通过开发者工具,我们发现,这个网页还是get请求,但是url特别长
不过不要被吓到了,打开负载页面,比对一下,你就会发现这些都相当于是附带的参数,只是格式和编码原因看起来有点乱。上面的 query=i%E9%81%93i 其实就是utf-8编码下的 query=i道i 。
对于这种情况,我们可以直接将url修改为这回请求的url(可以适当裁剪,只保留关键信息),或者采用下面的方法:
import requests
url = "http://www.sogou.com/web"
headers = {
# 用户代理,某些网站验证用户代理,微微改一下,如果提示要验证码之类的,使用它
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
}
params = {
"query": "i道i"
}
with requests.get(url=url, headers=headers, params=params) as resp:
resp.encoding = "utf-8" # 当页面乱码改这里
print(resp)
print(resp.text)
with open("sogou.html", mode="w", encoding="utf-8") as f: # 下载源码
f.write(resp.text)
下面是显示的结果,看起来像是只有内容,失去了格式,这是因为搜狗网页html源代码就是这样的,网页除了html源代码以外,还能通过诸如css js脚本 等来动态的显示格式,所以,我们有时候在页面能看见的东西,使用ctrl+u查看页面源代码时却看不见,因为这些东西是后面通过js发送的其他请求动态添加到页面的。
(三)、post
许多需要向服务器提交数据的行为,比如上传文件,论坛发帖等都是要post请求来修改服务器数据。这里就拿百度翻译为例子。百度翻译网页打开时,发送的请求是get请求,但提交待翻译文本时用的时post请求(只用于练手,请勿商用,请勿过多访问)
直接获取右面翻译结果有些太难了,不亚于泼猴去梅山,这里走条捷径,顺着需要翻译的字一划,能开启划译功能
从抓包工具中能看到多了两条请求,我们看transapi的负载和响应:
可以看出,这条就是我们需要的请求响应中["data"][0]["dst"],所以,我们通过以下python代码就可以获得百度翻译的结果:
import requests
url = "https://fanyi.baidu.com/transapi"
headers = {
# 用户代理,某些网站验证用户代理,微微改一下,如果提示要验证码之类的,使用它
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
}
params = {
"query": "i道i",
"from": "zh",
"to": "en",
"source": "txt",
}
with requests.post(url=url, headers=headers, params=params) as resp:
resp.encoding = "utf-8"
print(resp)
print(eval(resp.text)["data"][0]["dst"])
注意,这里post返回的resp.text是str,你可以使用eval或者resp.json()来转字典。这样我们就获取到结果了。
后续:数据解析
改天写数据解析的三种工具:正则、bs4、xpath,详情见二、数据解析