requests 模塊

爬蟲

概念:編寫程序模擬瀏覽器上網,讓其去互聯網上獲取數據的過程html

  • 通用爬蟲:一整張頁面
  • 聚焦爬蟲:頁面中局部的內容

反爬機制:對應的載體是門戶網站python

反反爬策略:對應的載體是爬蟲程序ajax

robots 協議:「防君子不防小人」json

User-Agent:請求載體的身份標識瀏覽器

requests 模塊

requests 模塊代碼編寫的流程服務器

  • 指定 URL
  • 發起請求
  • 獲取響應對象中的數據
  • 持久化存儲
import requests

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

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

# 獲取響應對象中的數據
page_text = response.text       # response.text是字符串

# 持久化存儲
with open('./sougou.html', 'w', encoding='utf-8') as fp:
    fp.write(page_text)

需求:爬取搜狗指定詞條搜索後的頁面數據app

需求:爬取百度翻譯結果(百度翻譯是一個局部的頁面刷新,所以發起的是一個基於 ajax 的異步請求)異步

response.text :返回字符串格式post

response.content :返回二進制格式網站

response.json() :返回 json 格式(要保證返回是 json 數據才能調用該方法)

爬取豆瓣電影分類排行榜(https://movie.douban.com/)中電影的詳情數據

豆瓣電影在鼠標滾輪下滑時會自動刷新更多的電影,也是局部頁面的 ajax 請求

爬取肯德基餐廳查詢(http://www.kfc.com.cn/kfccda/index.aspx)中指定地點的餐廳數據

爬取國家藥品監督管理總局中基於中國化妝品生產許可證相關數據(http://125.35.6.84:81/xk/

每家公司都是一個跳轉頁面,所以要拿到這些跳轉的 a 標籤,由於要獲取的是點擊 a 標籤中的詳細信息。點擊翻頁時 URL 並無變化,所以是 ajax 請求,可是在獲取到響應對象的數據時,數據中並無 a 標籤。可是這些數據中有 ID

當點進這些 a 標籤進入詳情頁時,該頁的 URL 也並不能獲取到詳細信息,所以這些詳細信息是動態加載出來的,目前所掌握的動態加載只有 ajax,在 Response 中就是該企業的詳情信息,發現該 URL 攜帶的參數是一個 ID,也就是上面所獲取的 ID,能夠使用循環獲取每個 ID

'''
循環產生字典做爲請求的參數,使用 requests 發的是 post 請求
會用到第三個參數 headers,這個參數涉及到 User-Agent,它是請求載體的身份標識
也就是說使用瀏覽器發請求和使用 requests 發請求,對應的請求載體不一樣,即身份標識不一樣
大部分的網站都會檢測對應請求的身份標識,正經常使用戶訪問都會經過瀏覽器發起請求
這裏使用的是爬蟲程序,它發的載體就不是基於某一款瀏覽器
若是使用 requests 發請求,服務器端是能夠檢測對應請求的身份標識,可能就拿不到想要的數據

反爬機制:UA(User-Agent)檢測 ---->  UA 假裝

能夠對當前使用 requests 發的請求載體進行假裝成基於某一瀏覽器的

這裏的 headers 就是請求頭信息
'''
import requests

url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
}
id_list = []

for page in range(1, 11):
    data = {
        "on": "true",
        "page": str(page),
        "pageSize": "15",
        "productName": "",
        "conditionType": "1",
        "applyname": "",
        "applysn": "",
    }
    json_data = requests.post(url=url, data=data, headers=headers).json()
    for dic in json_data['list']:
        id = dic['ID']
        id_list.append(id)

detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_list:
    detail_data = {
        "id": id
    }
    detail_json = requests.post(url=detail_url, data=detail_data, headers=headers).json()
    print(detail_json)

圖片爬取

相關文章
相關標籤/搜索