概念:編寫程序模擬瀏覽器上網,讓其去互聯網上獲取數據的過程html
反爬機制:對應的載體是門戶網站python
反反爬策略:對應的載體是爬蟲程序ajax
robots 協議:「防君子不防小人」json
User-Agent:請求載體的身份標識瀏覽器
requests 模塊代碼編寫的流程服務器
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)