2019.5.13,今天在「小猿圈」跟着波波老師學習了爬蟲開發的第一章和第二章,總結下今天學的知識:html
爬蟲基礎介紹: python
什麼是爬蟲?
- 經過編寫程序,模擬瀏覽器上網,而後讓其去互聯網上抓取數據的過程。
爬蟲的價值:
- 實際應用
- 就業
爬蟲到底是合法仍是違法的?
- 在法律中不被禁止
- 具備違法風險
- 善意爬蟲 惡意爬蟲
爬蟲帶來的風險能夠體如今以下兩個方面:
- 爬蟲干擾了被訪問網站的正常運營
- 爬蟲抓取了受到法律保護的特定類型的數據或信息
如何在使用編寫爬蟲的過程當中避免進入局子的厄運呢?
- 時常優化本身的程序,避免干擾被訪問網站的正常運行
- 在使用,在使用,傳播爬取到的數據時,審查抓取到的內容,若是發現了設計到用戶
隱私商業機密等敏感內容須要及時中止爬取或傳播
爬蟲在使用場景中的分類:
- 通用爬蟲:
抓取系統重要組成部分。抓取的是一整張頁面數據。
- 聚焦爬蟲:
是創建在通用爬蟲的基礎之上,抓取的是頁面中特定的局部內容。
- 增量式爬蟲:
檢測網站中數據更新的狀況,只會抓取網站中更新出來的數據。
爬蟲的矛與盾
反爬機制
- 門戶網站,能夠經過制定相應的策略或者技術手段,防止爬蟲程序進行網站數據的爬取。
反反爬策略
- 爬蟲程序能夠經過制定相關的策略或者技術手段,破解門戶網站中具有的反爬機制,
從而能夠獲取門戶網站的數據
robots.txt協議:
- 君子協議。規定了網站中哪些數據能夠被爬蟲爬取哪些數據不能夠被爬取
http協議
- 概念:就是服務器和客戶端進行數據交互的一種形式。
經常使用請求頭信息
- User-Agent:請求載體的身份標識
- Connection:請求完畢後,是斷開鏈接仍是保持鏈接
經常使用響應頭信息
- Content-Type:服務器響應回客戶端的數據類型
https協議:
- 安全的超文本傳輸協議
加密方式
- 對稱密鑰加密
發送方將密鑰經過網絡傳輸給接收方
- 非對稱密鑰加密
發送方建立密鑰對,對文件用公鑰進行加密,將公鑰傳輸給接收方,用密鑰對和私鑰解密
- 證書密鑰加密
對公鑰進行數字簽名,將公鑰和證書綁定在一塊兒發送給接收方
requests模塊基礎:
requests模塊:python中原生的一款基於網絡請求的模塊,功能很是強大,簡單便捷,效率極高。
做用:模擬瀏覽器發請求。
如何使用:(requests模塊的編碼流程)
- 指定urL發起請求
- 獲取響應數據
- 持久化存儲
環境安裝:
- pip install requests
- 也能夠在pycharm中:Settings --> Project --> Project Interpreter --> "+" 添加requests
實戰編碼:
- 需求:爬取搜狗首頁的頁面數據
實戰鞏固
- 需求:爬取搜狗指定詞條對應的搜索結果頁面(簡易網頁採集器)
- UA檢測
- UA假裝
- 需求:破解百度翻譯
- post請求(攜帶了參數)
- 響應數據是一組json數據(如何確認?)
打開頁面 --> F12 --> Network --> Headers --> Response Headers
--> Content-Type --> application/json
- 需求:爬取豆瓣電影分類排行榜 https://movie.douban.com/中的電影詳情數據
- 打開頁面 --> F12 --> 滑動混輪,出現新的Name --> 查看Headers信息
--> 用的是get()方法 --> 下拉到底端 --> 找到應該配置的參數後寫入字典
--> 將字典參數傳到get()方法的形參params中
- 需求:爬取肯德基餐廳查詢http://www.kfc.com.cn/kfccda/index.aspx中指定地點的餐廳數
- 需求:爬取國家藥品監督管理總局中基於中華人民共和國化妝品生產許可證相關數據
http://125.35.6.84:81/xk/
1 # Author:K 2 # 需求:爬取搜狗首頁的頁面數據 3 4 import requests 5 6 # step 1:指定url 7 url = 'https://www.sogou.com/' 8 9 # step 2:發起請求 10 response = requests.get(url = url) # get()方法會返回一個相應對象 11 12 # step 3:獲取響應數據: 13 page_text = response.text # text方法返回的是字符串形式的相應數據 14 print(page_text) 15 16 # step 4:持久化存儲 17 with open('./sogou.html','w',encoding='utf-8') as fp: 18 fp.write(page_text) 19 20 print("爬取數據結束!")
1 # Author:K 2 import requests 3 4 # UA假裝: 5 headers = { 6 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 7 } 8 9 keyword = input("Please input keyword:") 10 url = 'https://www.sogou.com/web?' 11 12 # 參數設置: 13 params = { 14 'query':keyword 15 } 16 17 response = requests.get(url = url,params = params,headers = headers) 18 19 data = response.text 20 21 fileName = keyword + '.html' 22 with open(fileName,'w',encoding='utf-8') as fp: 23 fp.write(data) 24 25 print("爬取結束!")
1 # Author:K 2 3 import requests 4 import json 5 6 url = 'https://fanyi.baidu.com/sug' 7 8 headers = { 9 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 10 } 11 12 kw = input("Please input keyword:") 13 data = { 14 'kw':kw 15 } 16 17 response = requests.post(url = url,data = data,headers = headers) 18 19 dic_obj = response.json() # 要肯定服務器響應的son數據才能使用此方法 20 21 # 存儲到本地 22 fileName = kw + '.json' 23 fp = open(fileName,'w',encoding='utf-8') 24 json.dump(dic_obj,fp = fp,ensure_ascii=False) # json文件中有中文,不能使用ascii編碼 25 26 print("爬取結束!")
1 # Author:K 2 import requests 3 import json 4 5 url = 'https://movie.douban.com/j/chart/top_list' 6 7 start_movie = input("Please input number that which movie you want to choose first:") 8 limit_movie = input("Please input number that how many movie one time display:") 9 10 params = { 11 "type": "5", 12 "interval_id": "100:90", 13 "action": "", 14 "start": start_movie, # 從第幾部電影開始取 15 "limit": limit_movie, # 一次取多少部 16 } 17 18 headers = { 19 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 20 } 21 22 response = requests.get(url = url,params = params,headers = headers) 23 24 list_obj = response.json() 25 26 fileName = "doubanMovie.json" 27 fp = open(fileName,'w',encoding = 'utf-8') 28 json.dump(list_obj,fp = fp,ensure_ascii = False) 29 30 print("Successful crawling!")
1 # Author:K 2 #--------------------------爲何查詢不出來???? 3 import requests 4 5 url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' 6 7 headers = { 8 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 9 } 10 11 #kw = input("Please input keyword:") 12 page_index = input("Which page you want to choose first:") 13 page_size = input("The pageSize is:") 14 15 data = { 16 "cname": " ", 17 "pid": " ", 18 "keyword": "北京", 19 "pageIndex": page_index, 20 "pageSize": page_size, 21 } 22 23 response = requests.post(url = url,data = data,headers = headers) 24 page_text = response.json() 25 print(page_text) 26 fileName = "KFC restaurant.txt" 27 with open(fileName,'w',encoding = 'utf-8') as fp: 28 fp.write(str(page_text)) 29 30 print("Successful crawling!")
1 # Author:K 2 import requests 3 import json 4 5 url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' 6 7 headers = { 8 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 9 } 10 11 all_data_list = [] # 存儲企業詳情數據 12 id_list = [] # 存儲企業對應的id 13 14 for page in range(1,5): # !!!!!!!!!!!!爲何這裏範圍大了就不行????????? 15 data = { 16 "on": " true", 17 "page": str(page), 18 "pageSize": " 15", 19 "productName": " ", 20 "conditionType": " 1", 21 "applyname": " ", 22 "applysn": " ", 23 } 24 25 dic_info = requests.post(url = url,data = data,headers = headers).json() 26 27 for dic in dic_info["list"]: 28 id_list.append(dic["ID"]) 29 30 info_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' 31 for id in id_list: 32 id_data = { 33 "id":id 34 } 35 36 info_response = requests.post(url = info_url,data = id_data,headers = headers) 37 dic_data = info_response.json() 38 all_data_list.append(dic_data) 39 40 # 持久化存儲 41 fileName_data = "data.json" 42 fp = open(fileName_data,'w',encoding = 'utf-8') 43 json.dump(all_data_list,fp = fp,ensure_ascii = False) 44 45 print(len(all_data_list)) 46 print("successful crawling!")
其中肯德基餐廳查詢和藥監總局這兩個案例未解決。後續在補充!