一、爬蟲的步驟 1、 需求分析(人做) 2、尋找網站(人)3、下載網站的返回內容(requests)4、通過返回的信息找到需要爬取的數據內容(正則表達式-re,xpath-lxml)5、存儲找到的數據內容(mysql) 二、requests import requests url = 'http:/ ...
一、爬蟲的步驟
1、 需求分析(人做)
2、尋找網站(人)
3、下載網站的返回內容(requests)
4、通過返回的信息找到需要爬取的數據內容(正則表達式-re,xpath-lxml)
5、存儲找到的數據內容(mysql)
二、requests
import requests url = 'http://www.baidu.com/' response = requests.get(url) print(response)
返回當前url的html信息,(其他url還可能獲取圖片等)
Response[200],Response是一個類,這個類重寫了__str__方法()
返回值,如果一個url能正常返回html內容,返回值就是200
處理亂碼的方式
1.查看編碼方式:右鍵檢查—>找到head—>charset就是編碼方式
2.通過response指定編碼方式
response.encoding = 'utf-8' print(response.text) print('=' * 30) print(response.content)
三、http協議
1.協議:即雙方遵守的語言,相當於語言,相同的語言能夠相互理解
2.HTTP協議
方法:GET POST
GET:通過URLl獲取網站的信息,不改變網站的狀態(不改變伺服器的任何內容)
POST:通過URL向網站傳輸信息,改變網站的狀態(POST比GET多from/body信息)
import requests form = { 'kw':'同' } url = 'https://fanyi.baidu.com/sug' response = requests.post(url, data = form) print(response.text)
HEAD:跟GET類似,但只有head信息s
OPTIONS:PUT通常指定了資源的存放位置
PUT:跟POST類似,但通常指定了資源的存放位置
DELET:刪除某個資源
3.HTTP協議的傳輸
Request —URL + request headers(請求頭信息)
Response —HTML ++ responce headers(返回頭信息)
General
Request URL: https://www.baidu.com/
Request Method: GET requests的獲取方法
Status Code: 200 OK 返回值
Remote Address: 14.215.177.39:443 伺服器名稱
Referrer Policy: no-referrer-when-downgrade
4.請求頭信息中重要的三個信息
a)User-Agent —身份是什麼
b)Referer —跳轉網頁是什麼(即現在的網頁是從哪個網頁來的)
c)cookie —本地存儲信息的—與伺服器的session一 一對應
添加的順序:a—>b—>c如果能夠獲取,不再添加
如果加上都不行,把headers全部複製下來
import requests url = 'https://www.xicidaili.com/nn/'
添加請求頭信息,字典的方式寫入
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36' } response = requests.get(url, headers = headers) with open('xicidaili.txt', 'wb') as f: f.write(response.content)
5.url的組成
1.協議部分,常見的有"http:", “ftp:”
2.功能變數名稱部分,如"www.baidu.com",也可以用IP地址代替
3.埠部分,跟在功能變數名稱後面的是埠,功能變數名稱和埠用":“作為分隔符,埠不是必須的,如果省略埠,採用預設埠,常見的埠"8080”
4.虛擬目錄部分:從功能變數名稱(埠)後面第一個“\”到最後一個“\”為止,是虛擬目錄部分
5.文件名部分:從最後一個"“到”?“為止,或者從最後一個”“到”#“為止,或者從最後一個”“到最後
6.參數部分:從”?“開始到”#“為止之間的部分為參數部分,也叫搜索部分,查詢部分。參數與參數之間用”&“作為分位符
7.錨部分:從”#"開始到最後,都是錨部分,他的作用是跳轉到本頁面的子目錄下,不載入新的頁面
6.Ajax:非同步載入,即url不變,經行操作後頁面發生變化,去看network里的XHR
7.json
import requests import json form = { 'kw':'同' } url = 'https://fanyi.baidu.com/sug' response = requests.post(url, data = form)
# json是一個包,函數loads的作用是輸入一個字元串,輸出這個json字元串的python類型數據
json_dict = json.loads(response.text) print(response.text) print("=" * 30) print(json_dict) translated = json_dict['data'][0]['v'] print("翻譯後的內容是:", translated)
8.去重
1、set的實現方式
通過hash函數和hash表實現的,(分而治之的思想)如10000 % 20把這些數分為20類
2、點陣圖
比如存100000個不重覆的數字,0-1000000之間,int形,一個int要占32bit,點陣圖即給10000位,數字0存在寫入1,不存在寫入0,以此類推
3、布隆過濾器
對於很多url,用hash函數對每個URL分組,對應一個數字,再根據這些數字做點陣圖