python學習筆記1.6 爬蟲

爬蟲的概念

  • 爬蟲是從事模擬瀏覽器發送請求,獲取響應

爬蟲的流程

  • 準備url
    • 準備start_url
      • url地址規律不明顯,總數不確定
      • 通過代碼提取下一頁url
        • xpath
        • 尋找url地址,部分參數在當前的響應中
    • 準備url_list
      • 頁面總數明確
      • 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,搜索數字和英文
    • 數據的提取
  • 保存
    • 保存在本地,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"),能夠返回括號裏的內容,括號前後的字符起到定位和過濾的作用
  • 原始字符串rre.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
  • 提取頁面數據的思路

    • 先分組,取到一個包含分組標籤的列表
    • 遍歷,取其中每一組進行數據的提取,不會造成數據的對應錯亂
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章