2.1、anaconda的安裝 1 、安裝可執行程式 2 、配置環境變數 根據環境變數的 去查找可執行程式文件,如果查找到就執行,如果查找不到就報錯。 3 、python的多版本相容問題 修改可執行程式的文件名,再配置環境變數 4 、hash案例 2.2、requests模塊 ...
2.1、anaconda的安裝
1 、安裝可執行程式
2 、配置環境變數
根據環境變數的先後順序
去查找可執行程式文件,如果查找到就執行,如果查找不到就報錯。
3 、python的多版本相容問題
修改可執行程式的文件名,再配置環境變數
4 、hash案例
import hashlib
def md5_encryption(value):
"""
對字元串進行加密
:param value:待加密的字元串
:return:進行md5加密後的值
"""
md5 = hashlib.md5()
md5.update(value.encode('utf-8'))
return md5.hexdigest()
2.2、requests模塊
一、 get請求
(1)、使用步驟
import requests # 1、導包
response = requests.get(url) # 2、發送請求,獲取響應
response.text # 3、獲取響應內容
(2)、get請求詳細參數
requests.get(
url=url, # 請求的url
headers=headers # 請求頭【字典】
params=params # 請求參數【字典】
)
# 返回一個response對象
(3)、response對象的屬性
獲取響應正文的內容
response.text
:獲取字元串格式的響應正文內容response.content
:獲取二進位格式的響應正文內容
獲取響應正文的編碼類型:
response.encoding
之所以能夠通過
response.text
獲取響應內容的字元串,是因為requests底層
使用response.encoding
來將正文的二進位
類型變成字元串
的。其他
response.status_code
:狀態碼response.headers
:響應頭
亂碼問題的解決辦法
產生亂碼的原因就編解碼時不一致,可以通過以下兩種方法解決:
- a、response.content.decode('頁面對應的編碼格式')
- b、response.encoding='頁面正確的編碼',然後通過response.text就能獲取正確的頁面內容
get請求案例
案例一:將百度貼吧的前10頁保存到本地
import requests
import os
base_url = 'http://tieba.baidu.com/f?'
kw = '劉亦菲' # 搜索的關鍵詞
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
}
filename = './tieba/' + kw # 爬取的網頁存放路徑
if not os.path.exists(filename):
# 如果不存在存放該網頁的目錄,就創建此目錄
os.mkdir(filename)
# 將網頁的前10頁保存到本地
for i in range(10):
params = {
'kw': kw,
'ie': 'utf-8',
'pn': i*50
}
response= requests.get(url=base_url, headers=headers, params=params)
with open(filename+'/'+kw+str(i+1)+'.html', 'w', encoding='utf-8') as f:
f.write(response.text)
案例二:百度翻譯
import requests
base_url = 'https://fanyi.baidu.com/sug/'
kw = 'product'
data = {
'kw': kw
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'x-requested-with': 'XMLHttpRequest',
'cookie': cookie;
'origin': 'https://fanyi.baidu.com',
'referer': 'https://fanyi.baidu.com/',
'content-length': str(len(str(data))), # 參數內容中所有所有字元的長度
}
response = requests.post(url=base_url, headers=headers, data=data)
# 如果response的內容是json數據,可以通過reponse.json()直接獲取json數據,返回的是一個字典或者list
json_data = response.json()
res = ''
for data in json_data['data']:
res += data['v'] + '\n'
print(res)
二、 post請求
(1)、post請求詳細參數
requests.get(
url=url, # 請求的url
headers=headers # 請求頭【字典】
data=data # 請求參數【字典】
)
# 返回一個response對象
通常很多網頁是通過Ajax發送post請求獲取數據,此時需要找發送Ajax請求攜帶的數據,也就是請求參數。
找請求參數有兩種方法:
- 查看這條ajax介面之前有沒有發送過一些ajax介面,如果有,可能這些介面的其中一個的響應內容裡面包含這個介面的數據。
- 有可能這個請求參數寫死到頁面中的。一般這種情況出現在滾動載入的第一版數據的獲取,有可能這麼做。
- 在js文件中去尋找參數。
案例一:有道翻譯
import requests
import hashlib
import time
import random
base_url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
kw = 'run'
def get_md5(value):
md5 = hashlib.md5()
md5.update(value.encode('utf-8'))
return md5.hexdigest()
"""
由於salt、sign和ts這3個參數由fanyi.js文件中js動態生成的
因此在發送post請求前,需要去動態地生成它們的值
salt = "" + (new Date).getTime() + parseInt(10 * Math.random(), 10)
ts = "" + (new Date).getTime()
sign = n.md5("fanyideskweb" + e + salt + "n%A-rKaT5fb[Gy?;N5@Tj")
"""
salt = str(time.time()*1000) + str(random.randint(1, 10))
sign = get_md5("fanyideskweb" + kw + salt + "n%A-rKaT5fb[Gy?;N5@Tj")
ts = str(int(time.time() * 1000))
data = {
'i': kw,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'ts': ts,
'bv': '710f3e24cb0088b9d9ea448919deb3bb',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=1291930369.870429; _ga=GA1.2.27463077.1574943185; _gid=GA1.2.609141079.1574943185; OUTFOX_SEARCH_USER_ID="[email protected]"; JSESSIONID=aaa7W8E0vjuZ-5hRbD26w; ___rl__test__cookies=1575019115684',
'Content-Length': str(len(str(data))),
}
response = requests.post(url=base_url, headers=headers, data=data)
json_data = response.json()
res = ''
for data in json_data['smartResult']['entries']:
res += data
print(res)