爬蟲
第二天
1.Response的常用屬性
- response.headers 響應頭
- response.request.headers 請求頭
- response.status_code 狀態碼
- response.request.url 請求的url
- response.url 響應的url
2. 帶headers的請求
headers = {"User-Agent":"一般從瀏覽器複製"}
request.get{url = url, headers = headers}
3.帶參數的請求
params = {"wd":""}
request.get(url = url, headers = headers, params = params)
4.url編碼和解碼
# url解碼
url = requests.utils.unquote(url)
# url編碼
requests.utils.quote(url)
5.迭代器和可迭代
class Meta():
def __init__(self):
self.num = 0
def __iter__(self):
return self
def __next__(self):
if self.num < 10:
self.num += 1
return self.num
raise StopIteration
"""
1.判斷Meta()對象是不是一個可迭代對象,查看是否具有__iter__()方法
2.獲取__iter__()的返回值,判斷是否是一個迭代器對象,查看時都同時具有__iter__()和__next__()方法
3.不停的調用__next__()的返回值,將其交給x,直到該方法拋出StopIteration異常
"""
for X in Meta():
print(X)
6.百度翻譯
import requests
import json
class BaiduFanyi(object):
def __init__(self, query_string):
self.query_string = query_string
self.headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
}
self.fanyi_url = "https://fanyi.baidu.com/basetrans"
self.lan_url = "https://fanyi.baidu.com/langdetect"
self.lan_from = "zh"
self.lan_to = "en"
def run(self):
# 1.準備語言檢測接口需要的數據
lan_data = self.get_lan_data()
# 2. 發起語言檢測請求,返回響應
lan_json_str = self.parse_post_url(self.lan_url, lan_data)
# 3. 解析語言檢測結果
self.get_lan_ret(lan_json_str)
# 2. 準備數據
data = self.get_data()
# 3. 發起請求,獲得響應
json_str = self.parse_post_url(self.fanyi_url, data)
# 4. 解析json,提取數據
ret = self.get_fanyi_ret(json_str)
print(ret)
def get_data(self):
"""
組裝翻譯接口的數據
:return:
"""
return {
"query": self.query_string,
"from": self.lan_from,
"to": self.lan_to
}
def parse_post_url(self, url, data):
"""
發起post請求,返回響應
:param url:
:param data:
:return:
"""
resp = requests.post(url=url, data=data, headers=self.headers)
return resp.content.decode()
def get_fanyi_ret(self, json_str):
"""
返回翻譯的結果
:param json_str:
:return:
"""
ret_dict = json.loads(json_str)
return ret_dict['trans'][0]['dst']
def get_lan_data(self):
"""
組裝語言檢測的數據
:return:
"""
return {
"query": self.query_string
}
def get_lan_ret(self, lan_json_str):
"""
解析語言檢測的結果,並修改翻譯需要的from和to的值
:param lan_json_str:
:return:
"""
ret_dict = json.loads(lan_json_str)
lan = ret_dict['lan']
if lan == "en":
self.lan_from = "en"
self.lan_to = "zh"
if __name__ == '__main__':
query_str = input(":")
fanyi = BaiduFanyi(query_str)
fanyi.run()
7.代理IP
單個IP頻繁請求一個網站的時候,很容易被識別爲一個爬蟲,爲了應對網站反爬蟲措施,可以使用代理
# 代理字典,key是代理的協議
proxies = {
"https": "https://119.127.17.80:6395"
}
url = "https://www.youtube.com/"
resp = requests.get(url=url, proxies=proxies)
代理ip的分類
- 透明代理:對方知道在使用代理,並且知道爬蟲的真實ip
- 匿名代理:對方知道在使用代理,但不清楚爬蟲的真實的ip
- 高匿代理:對方不知道在使用代理,更不清楚爬蟲的真實的ip
8. requests處理cookies之Session
創建一個session類的實例對象,和requests庫一樣,可以直接使用get和post方法
第一次使用session.post()的時候,網站會通過響應頭set-cookies讀取需要保存的cookies信息,並保存在session對象的cookies屬性中,下一次再發送請求的時候,會自動將保存的cookie寫入請求頭中,就可以訪問登陸後的頁面數據了。
import requests
session = requests.Session()
data = {
"email": "xxx",
"password": "xxxx"
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0"
}
resp = session.post("http://www.renren.com/PLogin.do", data=data, headers=headers)
resp = session.get("http://www.renren.com/966796789/profile", headers=headers)
print(resp.content.decode())