使用Python中的re模塊提取頁面數(shù)據(jù)

使用Python語言作為工具進行web數(shù)據(jù)爬取是一件很輕松的事隔节。正則表達式則是一種可以高速匹配文本的操作,當正則表達式與Python相結(jié)合時遂赠,也會摩擦出不一樣的火花宁否。

本文將通過一個簡單的爬蟲案例對簡書頁面進行數(shù)據(jù)爬取,運用requests模塊與re模塊铸磅。抓取簡書首頁1000條文章鏈接與標題骤素。

依賴庫

該案例需要導入以下3個Python模塊。

  • requests
  • fake_useragent
  • re

其中愚屁, requests和fake_useragent并不是Python標準庫的模塊,使用前可以通過pip安裝一下痕檬。

pip install requests -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

pip install fake_useragent -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

當然霎槐,requests也可以使用urllib代替,主要用來請求頁面并返回數(shù)據(jù)梦谜。

fake_useragent的功能為自動生成一個user-agent丘跌,當然也可使用自己瀏覽器的user-agent。

re模塊則是Python標準庫的正則模塊唁桩,在本案例中用于過濾數(shù)據(jù)闭树,關(guān)于re模塊的使用可以參考筆者之前的文章。

import re
import requests
import fake_useragent

尋找接口

筆者推薦使用Chrome瀏覽器進行接口排查荒澡。

首先進入在Chrome中進入簡書首頁报辱,按f12進入開發(fā)者工具狀態(tài),并找到Network選項单山。

由于頁面通過滾輪滑動實現(xiàn)了加載數(shù)據(jù)碍现,所以筆者認為這是通過Ajax進行了數(shù)據(jù)渲染。

在Network下有一個XHR的選項米奸,這個選項便是頁面中出現(xiàn)的所有Ajax接口昼接。

對爬蟲工程師而言,最敏感的單詞之一莫過于page悴晰,即:頁碼慢睡。沒錯逐工,在Headers里的Request URL的鏈接便是我們需要的接口。

構(gòu)建請求頭

關(guān)于請求頭漂辐,我們需要構(gòu)建:

  • User-Agent:防止被檢測為爬蟲程序
  • X-Requested-With:Ajax請求頭
  • Cookie:添加Cookie是為了爬取推送給本人賬號的數(shù)據(jù)
# 實例化UserAgent對象
user_agent = fake_useragent.UserAgent(use_cache_server=False)

url = 'http://www.reibang.com/?seen_snote_ids%5B%5D=66169577&seen_snote_ids%5B%5D=70078184&seen_snote_ids%5B%5D=59133070&seen_snote_ids%5B%5D=71131220&seen_snote_ids%5B%5D=69717831&seen_snote_ids%5B%5D=71082246&seen_snote_ids%5B%5D=69512409&seen_snote_ids%5B%5D=66364233&seen_snote_ids%5B%5D=68425069&seen_snote_ids%5B%5D=65829398&seen_snote_ids%5B%5D=70390517&seen_snote_ids%5B%5D=70715611&seen_snote_ids%5B%5D=60025426&seen_snote_ids%5B%5D=69454619&page={}'

# 請求頭
headers = {
    # 隨機生成1個user-agent
    'User-Agent': user_agent.random,
    'X-Requested-With': 'XMLHttpRequest',
    'Cookie': 'xxxxxxx',
}

# 設(shè)置代理(可省略)
proxies = {
    'http': 'http://54.241.121.74:3128',
    'https': 'http://54.241.121.74:3128'
}

需要注意泪喊,url鏈接的page屬性使用了{}進行后續(xù)頁碼的傳遞。

請求頁面

首先我們先構(gòu)建1個全局變量num用來對提取的數(shù)據(jù)進行計數(shù)者吁。

num = 1

接下來便是請求頁面了窘俺。

# 初始頁碼
count = 0

# 循環(huán)請求頁面
while True:
    response = requests.get(
        # 傳入頁碼
        url=url.format(i),
        headers=headers,
        proxies=proxies
    )
    
    count += 1
    
    # 解析頁面
    title_and_link = get_data(response.text)
    # 展示數(shù)據(jù)
    show_data(title_and_link)
    
    # 如果judge為True,代表已經(jīng)爬取了1000條數(shù)據(jù)
    if num > 1000:
        break

解析頁面

def get_data(text):
    """
    提取頁面源碼中的信息
    :param text: 頁面源代碼
    :return: result
    """
    # 生成正則對象
    pattern = re.compile(r'<a class="title" target="_blank" href="(.*?)">(.*?)</a>', re.S)
    # 查找符合上一行正則對象的數(shù)據(jù)
    result = pattern.finditer(text)
    
    return result

展示數(shù)據(jù)

def show_data(title_and_link):
    """
    展示數(shù)據(jù)
    :param title_and_link: 數(shù)據(jù)
    :return: None
    """
    # 重新聲明num
    global num

    for i in title_and_link:
        # 打印數(shù)據(jù)
        print(f'{num}:http://www.reibang.com{i.group(1).strip()}', end=' ')
        print(i.group(2).strip())
        num += 1
        if num > 1000:
            print('完成任務(wù)8吹省A隼帷!')
            break

結(jié)語

這個爬蟲程序還是比較簡單的育八,畢竟找到接口对途,就可以一步步的深挖數(shù)據(jù)。

實際上髓棋,這個爬蟲程序存在著一些比較顯而易見的bug实檀,尤其是當你沒有設(shè)置Cookie的時候。

沒錯按声,由于接口原因膳犹,當我們沒有設(shè)置Cookie時,爬取的數(shù)據(jù)基本上是重復的签则,并且Cookie也并不能完美的解決這個問題须床。當數(shù)據(jù)量較大時,即使設(shè)置了Cookie也會出現(xiàn)重復的數(shù)據(jù)渐裂。

這個bug最直接的解決方案便是更換接口豺旬,但這樣做也代表著需要重構(gòu)部分代碼(雖然也沒多少代碼)。確實柒凉,通過Chrome的開發(fā)者工具查看族阅,其他的接口也是存在的,主要看你能不能找到罷了膝捞。此外坦刀,使用selenium也是一個不錯的選擇。此處也體現(xiàn)了爬蟲程序的主觀性蔬咬,即實現(xiàn)功能的方法是多種多樣的求泰。不過筆者想說的是,既然提到了去重计盒,那怎么能少了Redis呢渴频?

沒錯,下篇文章便是對上述的爬蟲程序進行去重的優(yōu)化操作北启。

關(guān)于本文的完整代碼卜朗,可以來筆者的GitHub下獲取拔第。

https://github.com/macxin123/spider/blob/master/jianshu/re_jianshu.py

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市场钉,隨后出現(xiàn)的幾起案子蚊俺,更是在濱河造成了極大的恐慌,老刑警劉巖逛万,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泳猬,死亡現(xiàn)場離奇詭異,居然都是意外死亡宇植,警方通過查閱死者的電腦和手機得封,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來指郁,“玉大人忙上,你說我怎么就攤上這事∠锌玻” “怎么了疫粥?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腰懂。 經(jīng)常有香客問我梗逮,道長,這世上最難降的妖魔是什么绣溜? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任库糠,我火速辦了婚禮,結(jié)果婚禮上涮毫,老公的妹妹穿的比我還像新娘。我一直安慰自己贷屎,他們只是感情好罢防,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唉侄,像睡著了一般咒吐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上属划,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天恬叹,我揣著相機與錄音,去河邊找鬼同眯。 笑死绽昼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的须蜗。 我是一名探鬼主播硅确,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼目溉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菱农?” 一聲冷哼從身側(cè)響起缭付,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎循未,沒想到半個月后陷猫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡的妖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年绣檬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羔味。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡河咽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赋元,到底是詐尸還是另有隱情忘蟹,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布搁凸,位于F島的核電站媚值,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏护糖。R本人自食惡果不足惜褥芒,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫡良。 院中可真熱鬧锰扶,春花似錦、人聲如沸寝受。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽很澄。三九已至京闰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甩苛,已是汗流浹背蹂楣。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讯蒲,地道東北人痊土。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像墨林,于是被迫代替她去往敵國和親施戴。 傳聞我的和親對象是個殘疾皇子反浓,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容