小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

爬蟲入門,看這一篇就夠了

 徒步者的收藏 2019-01-11

本文旨在科普,用最簡單明了的語言引導初學者接觸爬蟲,不求嚴謹??吹讲欢幕蛘卟幌攵膶S忻~不要糾結,只要代碼沒問題就繼續(xù)下去,等爬取成功了再回頭摳細節(jié)。

我將以虎撲火箭專區(qū)為例,爬取火區(qū)前一百頁的標題。
(實在不喜歡火箭的可以用其它球隊哈)

最先要說明的是,Python爬蟲非常簡單?。ó斎皇侵溉腴T)

  • Python的語法簡單

  • Python有很強大的模塊供我們調(diào)用

好了,直入主題吧!

導入三個模塊

requests 用來發(fā)送請求(發(fā)送了請求,服務器才會響應你,你的瀏覽器才有內(nèi)容顯示)
pyquery 用來解析頁面
fake_useragent 用來偽造請求頭(相當于身份證)

import requests
from pyquery import PyQuery as pq
from fake_useragent import UserAgent 

第一步 爬取

火箭專區(qū)地址:https://bbs.hupu.com/rockets
我們直接用requests發(fā)送get請求

url = 'https://bbs.hupu.com/rockets'
r = requests.get(url)
print(r)


這個r就是HTTP狀態(tài)碼,我們最常見的404也是狀態(tài)碼


print(r.text)


爬取頁面就搞定了,不過出來的都是源碼,我們要篩選出想要的信息

第二步 解析

要解析頁面,必須先要了解一下頁面的結構,我們先去火箭專區(qū),然后右鍵第一個標題,檢查(以chrome瀏覽器為例,360瀏覽器好像是審查元素)

Elements面板下展示的內(nèi)容,就是網(wǎng)頁的DOM節(jié)點和CSS樣式,簡單說就是網(wǎng)頁的結構和內(nèi)容,按小三角可以折疊和展開,鼠標放在代碼上面,左邊會高亮對應的內(nèi)容,雙擊代碼可以直接編輯。

  • ...
  • 這樣的叫做標簽
    class='for-list' 這樣帶等號的叫做屬性,有點像python的字典,等號左邊是屬性名,右邊是屬性值
    class屬性是非常常用的屬性,也叫做類名

    經(jīng)過觀察,我們會發(fā)現(xiàn)每個帖子信息都在li標簽里面
    而標題內(nèi)容都在class屬性為truetit的a標簽里面

    下面簡單粗暴地說下pyquery的語法(細講的話要另起一文了)

    標簽直接寫,
    class屬性前面加個點,
    id屬性前面加個#
    空格表示嵌套關系(也就是子孫節(jié)點)
    (結合下面代碼理解)

    #初始化,先讓pyquery認識它,才能解析它
    doc = pq(r.text)

    #class屬性為for-list的ul標簽 下面的li標簽
    #因為我們要分別取出每個li標簽的內(nèi)容,所以要加上items方法方便遍歷
    info = doc('ul.for-list li').items()#

    #對每個li標簽,提取它嵌套的class屬性為truetit的a標簽的內(nèi)容
    #獲取文本用text方法
    for i in info:
            title = i('a.truetit').text()
            print(title)


    成功了!
    既然成功爬取了第一頁,我們就試試爬前十頁

    要有網(wǎng)址才能爬取,所以我們先要解決網(wǎng)址的問題,常規(guī)思路是提取網(wǎng)站下一頁的鏈接,但是虎撲的下一頁其實是javascript渲染的。而我們用requests直接發(fā)送get請求得到的是未經(jīng)渲染的原始信息。js渲染這種高級的東西我們目前無法解決,但我們通過點擊下一頁網(wǎng)址可以發(fā)現(xiàn)

    • 第一頁:https://bbs.hupu.com/rockets

    • 第二頁:https://bbs.hupu.com/rockets-2

    • 第三頁:https://bbs.hupu.com/rockets-3

    似乎橫杠后面的數(shù)字就是頁數(shù)
    我們試試-1,-10能不能轉(zhuǎn)到第一頁和第十頁,結果是能的
    所以我們就通過這個取巧的方法得到了前十頁的網(wǎng)址
    把我們之前的代碼封裝成函數(shù)

    def get_title(n):
        url = f'https://bbs.hupu.com/rockets-{n}'
        r = requests.get(url)
        doc = pq(r.text)
        info = doc('ul.for-list li').items()
        for i in info:
                title = i('a.truetit').text()
                print(title)

    然后在1-10遍歷一下

    for i in range(11):
        get_title(i)

    十頁標題就嘩嘩嘩地爬出來了

    但我們的目標是要爬100頁的
    照葫蘆畫瓢把range(11)改成range(101)不就可以了?

    *for i in range(11):
        get_title(i)

    事實證明是不行的,出來的還是前十頁的標題,那問題出在哪呢?
    之前我們得到結論,橫杠后面的就是頁數(shù),難道第十頁之后網(wǎng)址變了?
    于是我們打開瀏覽器,試著打開https://bbs.hupu.com/rockets-20
    發(fā)現(xiàn)瀏覽器跳轉(zhuǎn)到了登錄界面,也就是說不登錄是看不到10頁以后的內(nèi)容的

    所以我們就要涉及到一個爬蟲的基礎知識了:headers(頭部信息)
    打開https://bbs.hupu.com/rockets-10
    右鍵檢查,進入network面板,這里記錄了從發(fā)起網(wǎng)頁頁面請求后,分析HTTP請求后得到的各個請求資源信息
    找到rockets-10,右邊的headers面板記錄了頭部信息

    • General 概況,重點:請求地址,方法,狀態(tài)

    • Response Headers 響應頭,重點:響應內(nèi)容類型

    • Request Headers 請求頭 重點: user-agent,cookie


    一般來說,構建headers的時候,user-agent是必要的,相當于你的身份信息,告訴服務器你是誰
    所以我們之前的爬蟲里我們的身份是什么呢

    #返回請求頭信息
    print(r.request.headers)


    這就相當于告訴服務器,我是python的requests模塊,我來找你了,大多數(shù)網(wǎng)站看到“非正常瀏覽器“的身份都不會返回數(shù)據(jù)給你的,所以我們要假裝成是正常瀏覽器

    我們在剛剛的headers面板里可以看到自己的user-agent的信息,可以復制下來,requests請求的時候加上個參數(shù)headers,

    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
    url = 'https://bbs.hupu.com/rockets-10'
    r = requests.get(url,headers=headers)

    但是復制粘貼還是略麻煩,我們可以用fake_useragent來偽造個user-agent

    from fake_useragent import UserAgent
    ua = UserAgent()
    print(ua.random)


    當然,這樣我們還是無法得到第十一頁的標題,因為我們在瀏覽器上輸入第十一頁的網(wǎng)址的時候,就彈出登錄界面,用瀏覽器訪問就相當于是正常瀏覽器身份了,所以不是user-agent的問題

    難道每次我們都要手動登錄才能爬嗎?有沒有方便點的方法?這種情況我們就要用上cookie了
    首先我們要老老實實地手動登陸一次,這是避免不了的,然后打開https://bbs.hupu.com/rockets-10,右鍵檢查,找到rockets-10的請求頭信息,找到cookie,添加到headers里


    ua = UserAgent()
    headers = {'user-agent':ua.random,
    'cookie':'把你的cookie粘貼過來'}
    url = f'https://bbs.hupu.com/rockets-{n}'
    r = requests.get(url,headers=headers)

    添加了cookie,嘗試一下

    for i in range(101):
        get_title(i)

      本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
      轉(zhuǎn)藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多