爬蟲的概念
- 爬蟲是從事模擬瀏覽器發送請求,獲取響應
爬蟲的流程
- 準備url
- 準備start_url
- url地址規律不明顯,總數不確定
- 通過代碼提取下一頁url
- xpath
- 尋找url地址,部分參數在當前的響應中
- 準備url_list
- 頁面總數明確
- url地址規律明顯
- 準備start_url
- 發送請求,獲取響應
- 添加隨機的User-Agent,防反爬蟲
- 添加隨機的IP,防反爬蟲
- 在對方判斷出我們時爬蟲之後,應該添加更多的headers字段,包括cookie
- cookie的這一塊我們可以用session來解決
- 準備一堆的cookie,組成cookie池
- 如果不登陸
- 準備剛開始能夠成功請求對方網站的cookie,即接收對方網站設置在response的cookie
- 下一次請求的時候,使用之前的列表中的cookie來請求
- 如果登陸
- 準備多個賬號
- 使用程序獲取每個賬號的cookie
- 之後隨機的選擇cookie請求登錄之後才能訪問的網站
- 如果不登陸
- 提取數據
- 確定數據的位置
- 如果數據在當前的url地址中
- 提取的時列表頁的數據
- 直接請求列表頁url地址,不用進入詳情頁
- 提取的是詳情頁的數據
- 1.確定url
- 2.發送請求
- 3.提取數據
- 4.返回
- 提取的時列表頁的數據
- 如果數據不在當前的url地址中
- 在其他的響應中,尋找數據的位置
- 1.從network中從上往下找
- 2.使用chrome鐘的過濾條件,選擇出js,css,img之外的按鈕
- 3.使用chrome的search all file,搜索數字和英文
- 在其他的響應中,尋找數據的位置
- 如果數據在當前的url地址中
- 數據的提取
- 確定數據的位置
- 保存
- 保存在本地,text,json,csv
- 保存在數據庫
爬蟲要根據當前的url地址對應的響應爲準,當前url地址的elements的內容和內容和url的響應不一樣
頁面的數據在那裏
- 當前url地址對應的響應中
- 其他的url地址對應的響應中
- 比如ajax請求中
- js生成的
- 部分數據在響應中
- 全部通過js生成
判斷請求是否成功
assert response.status_code == 200
url編碼
https://tieba.baidu.com/f?kw = \xe6\x9d\x8e\xe6\xaf\x85
字符串格式化的另一種方式
"test{}format".format(1)
使用代理ip
-
準備一對的ip地址,組成ip池,隨機選擇一個ip來用
-
如何隨機選擇代理ip,讓使用次數少的ip地址有更大的可能性被用到
- {"ip":"ip","times":0}
- [{},{},{}],對這個ip的列表按照使用次數排序
- 選擇使用次數少的10個ip,從中隨機選擇一個
-
檢查ip的可用性
- 可以使用requests添加超時參數,判斷ip地址的質量
- 在線代理ip質量檢測的網站
攜帶cookie請求
- 攜帶一堆cookie進行請求,把cookie組成cookie池
使用requests的session對象請求登錄之後的網站的思路
- 實例化session
- 先使用session發送請求,登錄網站,把cookie保存在session中
- 再使用session請求登錄之後才能訪問的網站,session能夠自動的攜帶登錄成功時保存在其中的cookie,進行請求
不發送post請求,使用cookie獲取登錄後的頁面
- cookie過期時間很長的網站
- 在cookie過期之前能夠拿到所有的數據,比較麻煩
- 配合其他程序一起使用,其他程序專門獲取cookie,當前程序專門請求頁面
字典推導式,列表推導式
cookies="BIDUPSID=3F25DC781B02548A8189297D491A16DD; PSTM=1560840870; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BAIDUID=6E8741147E64571FFFFA7DF44E44AA92:FG=1; BDSFRCVID=bW_OJeC62A5IuP7uPMTjh-bydaMeSM5TH6ao4XCgB-Mx1SpMBEdXEG0Pof8g0KubyKdsogKK3gOTH4PF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tJk8oK0atCI3fn5PqR6OM5JBD2T22-usbPjd2hcH0KLKfpR6Xbro5t-Xhx73e4j2LKjaQ4TnJfb1MRjv3bOrQJDnMxv7QxJibjLDBl5TtUJ6eCnTDMRh-l0QWtOyKMnitKv9-pP2LpQrh459XP68bTkA5bjZKxtq3mkjbPbDfn02eCKuD6K5j6jWeaus-bbfHJIDoCP8Kb7Vbno5BUnkbfJBD4LtBRQTJ5TT2xb_2T6DJJbpXto6XjL7yajK253v0KvGsl6ytxO28qoHbh7pQT8rhUDOK5OibCr8abbbab3vOIOTXpO1jh8zBN5thURB2DkO-4bCWJ5TMl5jDh3Mb6ksD-FtqtJHKbDHVCL5Jx5; BDUSS=3haUmNJWm5wVGZTfkJRdU51ZVRqRkIxTVBKTndFZ1hsTE1obnhveFRXVW5BUmhmSVFBQUFBJCQAAAAAAAAAAAEAAAD3M-mAt8m457XEzt672tGh1PEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACd08F4ndPBeU; delPer=0; PSINO=6; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1593326774; Hm_lvt_afd111fa62852d1f37001d1f980b6800=1593327266; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; H_PS_PSSID=31907_1461_31325_21117_32139_32046_32092; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; yjs_js_security_passport=a082f5fec3423f5c0b369379442d3581fc8d776d_1593328810_js; __yjsv5_shitong=1.0_7_448adffc4ebfb602d1a695933e08cd93d7b3_300_1593329008410_113.116.115.100_3562e738; Hm_lpvt_afd111fa62852d1f37001d1f980b6800=1593329133; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1593329134"
cookies={i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
[self.url_temp.format(i*50) for i in range(1000)]
獲取登錄後頁面的三種方式
- 實例化session,使用session發送post請求,再使用他獲取登錄後的頁面
- headers中添加cookie
- 在請求方法中添加cookies參數。cookie以字典形式接受
安裝第三方模塊
- pip install
- 下載源碼解碼,進入解壓後的目錄,運行:
python setup.py install
***.whl
安裝方法pip install ***.whl
json使用注意點
- json中的字符串都是雙引號引起來的
- 如果不是雙引號
- eval:能實現簡單的字符串和python類型的轉化
- replace:把單引號替換爲雙引號
- 如果不是雙引號
正則使用的注意點
re.findall("a(.*?)b","str")
,能夠返回括號裏的內容,括號前後的字符起到定位和過濾的作用- 原始字符串r
re.findall(r"a(.*?)b","str")
,能夠忽略待轉譯字符串中反斜槓的轉譯效果 - 點號默認匹配不到
\n
\s
能夠匹配到空白字符,不僅包含空格,還有\t|\r\n
xpath學習重點
-
使用xpath helper 或者是Chrome中的copy xpath都是從elements中提取的數量, 但是爬蟲獲取的是url對應的響應,往往和elements不一樣
-
獲取文本
a/text()
獲取a下的文本a//text()
獲取a下的所有標籤的文本
-
@符號
a/@href
//ul[@id="detail-list"]
-
//
- 在xpath開始的時候表示從當前html總的任意位置開始選擇
p//a
表示的是p下的任何一個a
lxml使用注意點
-
lxml能夠修正HTML代碼,但是可能會改錯
- 使用etree.tostring()觀察修改之後的html的樣子,根據修改之後的html 字符串寫xpath
-
提取頁面數據的思路
- 先分組,取到一個包含分組標籤的列表
- 遍歷,取其中每一組進行數據的提取,不會造成數據的對應錯亂