百度搜索引擎是一个很大的爬虫
模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动抓取互联网信息的程序。
12306抢票、网站投票、短信轰炸
爬虫的流程:
url–>发送请求、获取响应—>提取数据—>保存
发送请求,获取响应—>提取url
页面上的数据在哪
HTTPS比HTTP更安全,但是性能更低
浏览器发送HTTP请求的过程
HTTP常见请求头
响应状态码(status code):
形式:scheme://host[:port#]/path/…/[?query-string][#anchor]
Cookie保存在浏览器本地,session保存在服务器
字符串类型的区别和转化
str类型和bytes类型
Unicode UTF8 ASCII
编码方式和解码方式必须一致,否则会乱码
import requests # 导入包
# -----------------------简单获取数据--------------------#
response = request.get("http://www.baidu.com") # 发送request请求
response.encoding # 获取编码方式
response.encoding = "utf-8" # 自定义编码方式
# 解码方式,三种都可以,可以反复尝试,选择其中一种
response.text # 解码1
response.content.decode() # 解码2
response.content.decode("gbk") # 解码3
# 不带headers只能获取部分的数据信息
# ---------------------获取图片信息---------------------- #
# requests保存图片
response = requests.get("地址.png")
# 保存
with open("a.png","wb") as f:
f.write(response.content)
# ---------------------请求和响应信息---------------------- #
response = requests.get("http://www.baidu.com")
response.status_code # 查看状态码
assert response.status_code == 200 # 判断请求是否成功
response.headers # 获取响应头,返回的是一个字典(dict)
response.request.headers # 获取请求头,返回的是一个字典(dict)
# -------------------发送带headers的请求------------------ #
headers = {
请求头headers的信息}
response = requests.get("http://www.baidu.com",headers=headers) #发送带headers的请求
response.content.decode() # 解码
# -------------------发送携带参数的请求------------------ #
headers = {
请求头headers的信息}
#方式一
p = {
"wd":"python"}
url_temp = "https://www.baidu.com/s" # 定义请求模板
response = requests.get("http://www.baidu.com",headers=headers,params=p) #发送带参数的请求
#方式二
url = "https://www.baidu.com/s?wd={}".format("python")
response = requests.get(url,headers=headers) #发送带参数的请求
response.content.decode() # 解码
哪些地方会用到POST请求:
用法:
import requests
import json
#data为字典(dict)
headers = {
} # headers信息从浏览器上F12找
post_data = {
} # data信息在浏览器上F12找
# 通过POST请求页面信息
response = requests.post("http://fanyi.www.baidu.com/basebreans",data=post_data,headers=headers)
print(response.content.decode()) # 输出解码后的数据,找到我们需要的数据
dict_ret = json.loads(r.content.decode())
ret = dict_ret["trans"][0]["dst"] # 在json数据中,找到想要的数据信息
用法:
requests.get("http://www.baidu.com",proxies=proxies)
# proxies格式:字典(dict)
# 代理IP可以去网上找
proxies = {
"http" : "http://12.34.56.79:9527",
"https" : "https://12.34.56.79:9527"
}
得到一堆ip地址,组成ip池,随机选择一个ip来使用
随机选择代理ip
检查IP的可用性
爬虫处理cookie和session
带上cookie、session的好处
能够请求到登录之后的页面
带上cookie、session的弊端
一套cookie和session往往和一个用户对应
请求太快,请求次数太多,容易被服务器识别出来
response.url
response.request.url
requests.post(url,data={
})
requests.get(url,headers={
})
requests.get(url,params={
})
requests.get(url,proxies={
协议:协议+ip+端口})
# 正向代理:客户端知道最终服务器的地址
# 反向代理:客户端不知道最终服务器的地址
session
实例化session(session具有的方法和requests一样)
session发送请求post请求,对方服务器设置的cookie会保存在session
session请求登录后能够访问的页面
cookie放在headers中
Cookie转化为字典放在请求方法中
requests.get(url,cookies={“name的值”:“values的值”})
import requests
import json
class Test:
def __init__(self,trans_str):
self.trans_str = trans_str
self.lang_detect_url = "http://fanyi.baidu.com/langdetect"
self.trans_url = "http://fanyi.baidu.com/basetrans"
self.headers = {
"User-Agen":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"}
def parse_url(self,url,data):
response = requests.post(url,data=data,headers=self.headers)
return json.loads(response.content.decode())
def get_ret(self,dict_response):#提取翻译的结果
ret = dict_response["trans"][0]["dst"]
print("result in :",ret)
def run(self): # 实现主要逻辑
# 1.获取语言类型
# 1.1 准备post的url地址,post_data
lang_detect_data = {
"query":self.trans_str}
# 1.2 发送post请求,获取响应
lang = self.parse_url(self.lang_detect_url,lang_detect_data)["lan"]
# 1.3 提取语言类型
# 2.准备post的数据
trans_data = {
"query":self.trans_str,"from":"zh","to","en"} if lang == "zh" else\
{
"query":self.trans_str,"from":"en","to":"zh"}
# 3.发送请求,获取响应
dict_response = self.parse_url(self.trans_url.trans_data)
# 4.提取翻译的结果
self.get_ret(dict_response)
if __name__ == '__main__':
trans_str = sys.argv[1]
test = Test(trans_str)
test.run()