requests模塊基礎

 

requests模塊javascript

 

 

 

requests模塊

- 一、爲何是requests模塊
    - python原生一個基於網絡請求的模塊,模擬瀏覽器發起請求
- 二、爲何要使用requests模塊
    - 一、自動處理url編碼          urllib.parse.quote()
    - 二、自動處理post請求的參數     urllib.parse.urlencode(parmre) 再轉字節
    - 三、簡化cookie和代理的操做
- 三、requests如何被使用
    - 安裝:pip install requests
    - 使用:
        一、指定url
        二、發請求
        三、獲取響應數據
        四、持久化存儲
- 四、經過5個基於requests模塊的爬蟲項目對該模塊進行系統學習和鞏固
    - get 請求
    - post 請求
    - ajax get
    - ajax post
    - 綜合
 

基於requests發get請求

- 需求:爬起搜狗首頁的頁面數據
In [8]:
import requests

# 指定url
url = 'https://www.sogou.com/'

# 發起請求
res = requests.get(url=url)

# 獲取數據:text能夠獲取響應對象中字符串形式的頁面數據
data = res.text

# 持久化存儲
with open('get.html','w',encoding='utf-8') as f:
    f.write(data)

print('Save Ok')
 
Save Ok
In [2]:
# response響應對象的經常使用屬性
import requests
url = 'https://www.sogou.com/'
res = requests.get(url)

#  content 獲取的是響應對象中二進制bytes類型的頁面數據
# print(res.content)

# 獲取二進制流:好比下視頻時。若是視頻10g,用response.content而後一會兒寫到文件中是不合理的。
# res = requests.get('xxx',stream=True)
# with open('movie.mp4','wb')as f:
#     for line in res.iter_content():
#         f.write(line)

# status_code  返回一個相應狀態碼  200
print(res.status_code)

# 返回響應頭信息 dict類型
# print(res.headers)

# 獲取請求的url
print(res.url)

# 編碼問題
# 有些網站返回的數據不是utf-8編碼格式
# res.encoding='gbk'

# 解析json
import json
res1 = json.load(res.text)  # 太麻煩

# 一步到位
res2 = res.json()
 
200
https://www.sogou.com/
 
  • requests發起帶參數的get請求
    • 需求:爬取搜狗詞條的頁面數據
In [1]:
import requests

url = 'https://www.sogou.com/web'

res = requests.get(url=url,params={'query':'江子牙'})

with open('jiangziya.html','w',encoding='utf-8') as f:
    f.write(res.text)

print('請求的URL:',res.url)
print('Save Ok')
 
請求的URL: https://www.sogou.com/web?query=%E6%B1%9F%E5%AD%90%E7%89%99
Save Ok
In [23]:
# requests自定義請求頭信息:假裝成瀏覽器
import requests

url = 'https://www.sogou.com/web'

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}

res = requests.get(url=url,params={'query':'江子牙'},headers=headers)
# get也能夠攜帶cookie發送請求:
# res = requests.get(url=url,params={'query':'江子牙'},headers=headers,cookies=cookies)

print(res.status_code)
 
200
 

基於requests發post請求

- 需求:登陸豆瓣網,獲取登陸成功後的頁面數據
In [2]:
import requests

url='https://accounts.douban.com/login'

data={
    'form_email':'13006293101',
    'form_password':'jw19961019',
}
res = requests.post(url=url,data=data)

print(res.status_code)
html = res.content

with open('douban_login.html','wb') as f:
    f.write(html)
print('登陸成功')

# 補充:
headers = {
    'content-type':'application/json'
}
# 沒有指定請求頭時,默認使用x-www-form-urlencode請求頭
# request.post(url='xxx',data={'a':1,'b':2})
# 指定請求頭爲application/json時。使用data傳值,服務端取不到值
# request.post(url='xxx',data={'a':1,'b':2},headers=headers)
# 不指定,可是指定json傳值,就意味這使用application/json請求頭
# requests.post(url='',json={'a':1,})
 
200
登陸成功
In [ ]:
 
 

基於requests發ajax的get請求

- 需求:爬取豆瓣網電影詳情的數據
In [70]:
import requests

url = 'https://movie.douban.com/j/new_search_subjects'

parmrs = {
    'sort': 'U',
    'range': '0,10',
    'tags':'' ,
    'start': 40,
    'genres': '愛情',
}
# 自定義請求頭信息
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'
}

res = requests.get(url=url,params=parmrs,headers=headers)
print(res.url)
import json
with open('douban_movie.json','w',encoding='utf-8') as f:
    json.dump(res.text,f,ensure_ascii=False)
 
https://movie.douban.com/j/new_search_subjects?sort=U&range=0%2C10&tags=&start=40&genres=%E7%88%B1%E6%83%85
 

基於requests發ajax的post請求

- 需求:爬取肯德基城市餐廳位置的數據
In [72]:
import requests

url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'

data = {
    'cname':'', 
    'pid': '',
    'keyword': '江西',
    'pageIndex': 1,
    'pageSize': 20,
}
res = requests.post(url=url,data=data)
print(res.url)
import json
with open('kfc.json','w',encoding='utf-8') as f:
    json.dump(res.text,f,ensure_ascii=False)
 
http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword
 

綜合項目實戰

- 需求 爬取搜狗知乎一個詞條對應必定範圍內頁碼錶示的頁面數據
In [81]:
# 前三頁的頁面數據 一、二、3
import requests,os

if not os.path.exists('pages'):
    os.mkdir('pages')

word = input('輸入你要搜索的關鍵詞:')
start_page = int(input('輸入要獲取的起始頁碼:'))
end_page = int(input('輸入要獲取的結束頁碼:'))

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}

url = 'https://zhihu.sogou.com/zhihu?'
for page in range(start_page,end_page+1):
    params = {
        'query':word,
        'page':page,
        'ie':'utf-8'
    }
    res = requests.get(url=url,headers=headers,params=params)
    print(res.url)
    file_name = word+str(page)+'.html'
    file_path = os.path.join('pages',file_name)
    with open(file_path,'w',encoding='utf-8') as f:
        f.write(res.text)
        print('第%s頁搜索成功'%page)
 
輸入你要搜索的關鍵詞:python
輸入要獲取的起始頁碼:1
輸入要獲取的結束頁碼:4
https://zhihu.sogou.com/zhihu?query=python&page=1&ie=utf-8
第1頁搜索成功
https://zhihu.sogou.com/zhihu?query=python&page=2&ie=utf-8
第2頁搜索成功
https://zhihu.sogou.com/zhihu?query=python&page=3&ie=utf-8
第3頁搜索成功
https://zhihu.sogou.com/zhihu?query=python&page=4&ie=utf-8
第4頁搜索成功
相關文章
相關標籤/搜索