1. 程式人生 > >python爬蟲get請求

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

(第一個,這裡就是sf1)

(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張圖片成功爬取