python爬蟲get請求
1.get請求常見使用方法
1.1網站分類
如下圖頁面的每個分類,通過get請求資料
1.2網站分頁
如:鏈家租房頁面的分頁
1.3搜尋關鍵字
如:百度搜索
1.4瀑布流引數
如百度圖片:不會一次性將所有圖片全部顯示出來,這樣會給伺服器造成壓力,也避免客戶長時間的等待,所以圖片都是慢慢加載出來的
2.urllib get
2.1 url分析
我們在爬取網站之前,要對網站的大體導航連結和頁面url進行分析
以無錫二手房為例分析得到:
首頁base_url:https://wx.lianjia.com
(1)位置:【區域】選擇濱湖,上方url為base_url + ershoufang/binhu
(2)位置:【地鐵線】選擇1號線,上方url為base_url + ershoufang/li4120025008033141/
(3)售價:選擇第二個【40-60萬】,上方url為base_url + ershoufang/p2(第一個價格區間,這裡就是p1)
(4)面積:選擇第三個【70-90平】,上方url為base_url + ershoufang/a3(第一個,這裡就是a1)
(5)房型:選擇第二個【二室】,上方url為base_url + ershoufang/l2(第一個,這裡就是l1)
(6)用途:選擇第二個【別墅】,上方url為base_url + ershoufang/sf3
(7)第二頁,上方url為base_url + ershoufang/pg2(第三頁,這裡就是pg3)
2.2 例項
需求:爬蟲無錫二手房價格在40萬以下的,面積在50平以下,一室的第一頁二手房資訊
# coding:utf-8
from urllib import request
input1 = input("是否需要查詢二手房資訊?輸入1:代表是;輸入2:代表不是>>>")
if int(input1) == 1:
input_page = input("1)第一頁;2)第二頁")
input_house = input("1)一室;2)二室;3)三室;4)四室>>>")
input_area = input("1)50平以下;2)50-70平;3)70-90平;4)90-120平>>>")
input_price = input("1)40萬以下;2)40-60萬;3)60-80萬;4)80-100萬>>>")
url="https://wx.lianjia.com/ershoufang/pg%sl%sa%sp%s"%(input_page,input_house,input_area,input_price)
headers = {
'Referer': 'https://wx.lianjia.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/68.0.3440.106 Safari/537.36'
}
req = request.Request(url=url,headers=headers)
response = request.urlopen(req)
result = response.read().decode()
print(result)
else:
print("輸入有誤,重新輸入")
3.request get
3.1 request.urlretrieve
(1)下載圖片我們需要藉助urllib模組的request功能集當中的urlretrieve
(2)urlretrieve(url,filename,reporthook)
三個引數:
url 資源的地址
filename 資源下載到本地的路徑(存放的路徑)
reporthook 回撥函式。當我們執行下載的時候reporthook指定的函式會自動被呼叫,
(3)reporthook的引數必須是函式,而且具有三個引數
第一個值是:單次下載大小
第二個值是:下載的次數
第三個值是:資源總大小
3.2 儲存圖片例項
from urllib import request
def loading(a,b,c):
d = a * b
result = d / c
if result >= 1:
result = 1
print(result)
request.urlretrieve(
"https://image1.ljcdn.com/320200-inspection/b878234f-a9af-46f1-b268-d79ed24389aa.JPG.296x216.jpg.437x300.jpg",
"1.jpg", #儲存的圖片名稱
loading # 回撥函式loading,必須有三個引數
)
4.百度圖片爬取
4.1 分析請求資料
(1)請求的格式都為json格式,百度圖片應該是用ajax動態載入圖片,而ajax傳輸資料的方式通常是json
(2)繼續檢視acjson包的header資訊。發現parameter引數,通過對比。我們在滑動頁面時,圖片一直在載入,pn值也一直在變。
我們做出如下總結:
Pn是當前的條數封頂
Rn是單次載入的條數,通俗的來說就是每次請求都載入30條
第一次請求:Pn = 30,Rn = 30,得到的圖片 0-30張
第二次請求:Pn = 60,Rn = 30,得到的圖片 30-60張
4.2案例:爬取150張圖片
# coding:utf-8
import requests
from urllib import request
url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj" \
"&ct=201326592&is=&fp=result&queryWord=%E7%8E%8B%E4%BF%8A%E5%87%AF%E5%9B%BE%E7%89%87&cl=2" \
"&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E7%8E%8B%E4%BF%8A%E5%87%AF%E5%9B%BE%E7%89%87" \ "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&pn=30&rn=30&gsm=1e&1538101746698="
headers = {
'Referer': 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1538101739459_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E7%8E%8B%E4%BF%8A%E5%87%AF%E5%9B%BE%E7%89%87',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
parameter_list = []
num_list = [30,60,90,120,150]
for num in num_list:
parameter = {
'tn':'resultjson_com',
'ipn':'rj',
'ct':'201326592',
'is':'',
'fp':'result',
'queryWord':'王俊凱圖片',
'cl':'2',
'lm':'-1',
'ie':'utf-8',
'oe':'utf-8',
'adpicid':'',
'st':'-1',
'z':'',
'ic':'0',
'word':'王俊凱圖片',
's':'',
'se':'',
'tab':'',
'width':'',
'height':'',
'face':'0',
'istype':'2',
'qc':'',
'nc':'1',
'fr':'',
'expermode':'',
'pn':num,
'rn':'30',
'gsm':'1e',
'1538101746698':''
}
parameter_list.append(parameter)
for parameter in parameter_list:
response = requests.get(url=url,params=parameter,headers=headers)
content = response.json().get("data")
for data in content:
image_url = data.get("middleURL")
if type(image_url) == str:
image_name = image_url.split("/")[5]
request.urlretrieve(image_url,"E://karrywang/%s"%image_name)
如圖:150張圖片成功爬取