1. 程式人生 > >爬蟲(1):requests模組

爬蟲(1):requests模組

requests介紹:

reqeusts模組:python原生一個基於網路請求的模組,模擬瀏覽器發起請求。

requests模組的優點:

- 1.自動處理url編碼 
- 2.自動處理post請求的引數
- 3.簡化cookie的代理的操作:
    cookie操作:
    - 建立一個cookiejar物件
    - 建立一個handler物件
    - 建立一個operner

    代理操作:
    - 建立handler物件,代理ip和埠封裝到該物件
    - 建立openner物件

reqeusts的使用流程:

- 安裝:pip install  requests
- 使用流程: - 1.指定url - 2.使用requests模組發起請求 - 3.獲取響應資料 - 4.進行持久化儲存

 

requests的使用:

一、 requests基礎用法:

1. 基於requests模組發起get請求

需求:爬取搜狗首頁的頁面資料

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

#發起get請求:get方法會返回請求成功的相應物件
response = requests.get(url=url)

#獲取響應中的資料值:
page_data = response.text  #
text可以獲取響應物件中 字串 形式的頁面資料 print(page_data) #持久化操作 with open('./sougou.html','w',encoding='utf-8') as fp: fp.write(page_data)

response物件其他的屬性:

#response物件中其他重要的屬性
import requests
#指定url
url = 'https://www.sogou.com/'

# requests.get() :發起get請求:get方法會返回請求成功的相應物件
response = requests.get(url=url)

# response.content 獲取的是response物件中二進位制(byte)型別的頁面資料 #print(response.content) # response.status_code :返回一個響應狀態碼 #print(response.status_code) # response.headers :返回響應頭資訊 #print(response.headers) # response.url :獲取請求的url #print(response.url)

requests 傳送攜帶 引數 的 get 請求:

需求:指定一個詞條,獲取搜狗搜尋結果所對應的頁面資料

方式一:

import requests

url = 'https://www.sogou.com/web?query=周杰倫&ie=utf-8'  # 引數直接放到 url 中

response = requests.get(url=url)
page_text = response.text

with open('./zhou.html','w',encoding='utf-8') as fp:
    fp.write(page_text) 

方式二:

import requests
#自定義請求頭資訊
headers={
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
#指定url
url = 'https://www.sogou.com/web'

#封裝get請求引數;放到一個字典中
prams = {
    'query':'周杰倫',
    'ie':'utf-8'
}
#發起請求
response = requests.get(url=url,params=param) # 設定 params=param

response.status_code

自定義請求頭資訊:

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

#將引數封裝到字典中
params = {
    'query':'周杰倫',
    'ie':'utf-8'
}

#自定義請求頭資訊
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}

response = requests.get(url=url,params=params,headers=headers)  # 設定 headers=headers 請求頭

response.status_code

2. 基於requests模組發起的post請求:

需求:登入豆瓣網,獲取登入成功後的頁面資料

import requests

#1.指定post請求的url
url = 'https://accounts.douban.com/login'

#封裝post請求的引數;POST請求的請求體資訊要放在一個字典中
data = {
    "source": "movie",
    "redir": "https://movie.douban.com/",
    "form_email": "15027900535",
    "form_password": "[email protected]",
    "login": "登入",
}
#自定義請求頭資訊
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}

#2.發起post請求
response = requests.post(url=url,data=data,headers=headers)  # data=data 設定請求體資訊

#3.獲取響應物件中的頁面資料
page_text = response.text

#4.持久化操作
with open('./douban.html','w',encoding='utf-8') as fp:
    fp.write(page_text)

3.基於 Ajax的GET請求: 

需求:抓取豆瓣電影上電影詳情的資料

import requests

url = 'https://movie.douban.com/j/chart/top_list?'

#封裝ajax的get請求中攜帶的引數;字典的形式
params = {
    'type':'5',
    'interval_id':'100:90',
    'action':'',
    'start':'100',
    'limit':'20'
}
#自定義請求頭資訊
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}

response = requests.get(url=url,params=params,headers=headers)  # params=params 設定 ajax 請求中攜帶的引數
print(response.text)

4. 基於 ajax的POST請求:

需求:爬去肯德基城市餐廳位置資料

import requests

#1指定url
post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'

#處理post請求的引數;字典的形式
data = {
    "cname": "",
    "pid": "",
    "keyword": "上海",
    "pageIndex": "1",
    "pageSize": "10",
}
#自定義請求頭資訊
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}

#2發起基於ajax的post請求
response = requests.post(url=post_url,headers=headers,data=data)  # data=data 設定 ajax 請求體中的引數

response.text

5. 綜合使用:

需求:爬取搜狗知乎某一個詞條對應一定範圍頁碼錶示的頁面資料

import requests
import os

#建立一個資料夾
if not os.path.exists('./pages'):
    os.mkdir('./pages')
    
word = input('enter a word:')  # 動態傳入要爬取的詞條

#動態指定頁碼的範圍
start_pageNum = int(input('enter a start pageNum:'))
end_pageNum = int(input('enter a end pageNum:'))

#自定義請求頭資訊
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
#1.指定url:設計成一個具有通用的url
url = 'https://zhihu.sogou.com/zhihu'

for page in range(start_pageNum,end_pageNum+1):
    param = {
        'query':word,
        'page':page,
        'ie':'utf-8'
    }
    response = requests.get(url=url,params=param,headers=headers)
    
    #獲取響應中的頁面資料(指定頁碼(page))
    page_text = response.text
    
    #進行持久化儲存
    fileName = word+str(page)+'.html'
    filePath = 'pages/'+fileName
    with open(filePath,'w',encoding='utf-8') as fp:
        fp.write(page_text)
        print('第%d頁資料寫入成功'%page)

 

 二、requests模組的高階用法:

 1. reqeusts模組的cookie操作:

- cookie:
    基於使用者的使用者資料
    - 需求:爬取張三使用者的豆瓣網的個人主頁頁面資料
- cookie作用:伺服器端使用cookie來記錄客戶端的狀態資訊。
實現流程:
    1.執行登入操作(獲取cookie)
    2.在發起個人主頁請求時,需要將cookie攜帶到該請求中
    注意:reqeusts模組的session物件:傳送請求(會將cookie物件進行自動儲存)

示例:

import requests

session = requests.session()  # 利用 requests.session() 去獲取到一個 session 物件;該 session 物件能夠儲存伺服器返回給客戶端的cookie
#1.發起登入請求:將cookie獲取,切儲存到session物件中
login_url = 'https://accounts.douban.com/login'
data = {
    "source": "None",
    "redir": "https://www.douban.com/people/185687620/",
    "form_email": "15027900535",
    "form_password": "[email protected]",
    "login": "登入",
}
headers={
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
#使用session發起post請求
login_response = session.post(url=login_url,data=data,headers=headers)  # 利用 requests 的 session物件 傳送 POST請求;通過伺服器的校驗後該 session物件會儲存 cookie

#2.對個人主頁發起請求(session(cookie)),獲取響應頁面資料
url = 'https://www.douban.com/people/185687620/'
response = session.get(url=url,headers=headers)  # 利用 session物件 傳送 GET請求(攜帶著cookie)
page_text = response.text

with open('./douban110.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
    
# 注意: 爬蟲程式應該嚴格遵從瀏覽器的請求流程

 

2. requests模組的代理操作:

- 1.代理:第三方代理本體執行相關的事物。生活:代購,微商,中介
- 2.為什麼要使用代理?
    - 很多網站有反爬操作;
    - IP代理是一種反反爬手段
- 3.分類:
    - 正向代理:代替客戶端獲取資料 (我們的爬蟲用的是 正向代理)
    - 反向代理:代理伺服器端提供資料
- 4.免費代理ip的網站提供商:
    - www.goubanjia.com   (推薦用這個)
    - 快代理
    - 西祠代理

示例:

import requests

url = 'http://www.baidu.com/s?ie=utf-8&wd=ip'

headers={
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }

#將代理ip封裝到字典;代理的協議應該和 url 中的協議一致,如:都是 http
proxy = { 
    'http':'77.73.69.120:3128'
}
#更換網路IP
response = requests.get(url=url,proxies=proxy,headers=headers)  # proxies=proxy  設定代理

with open('./daili.html','w',encoding='utf-8') as fp:
    fp.write(response.text)