1. 程式人生 > >【MOOC】Python網路爬蟲與資訊提取-北京理工大學-part 3

【MOOC】Python網路爬蟲與資訊提取-北京理工大學-part 3

【第三週】網路爬蟲之實戰

一、Re(正則表示式)庫入門

1.正則表示式的概念

1.1正則表示式是什麼

正則表示式是用來簡潔表達一組字串的表示式。
使用正則表示式的優勢就是:簡潔、一行勝千言 一行就是特徵(模式)

例1:代表一組字串:
這裡寫圖片描述
例2:代表一組(無窮個)字串:
這裡寫圖片描述
例3:代表一組具有某種特點但是列舉起來很繁瑣的字串:
這裡寫圖片描述

簡單來說:
正則表示式是用來簡潔表達一組字串的表示式
正則表示式是一種通用的字串表達框架
正則表示式是一種針對字串表達“簡潔” 和“ 特徵” 思想的工具
正則表示式可以用來判斷某字串的特徵歸屬

1.2正則表示式可以幹嘛

正則表示式在文字處理中十分常用:
可用來表達文字型別的特徵(病毒、入侵等)


可用來同時查詢或替換一組字串
可用來匹配字串的全部或部分
可用來……
最主要應用在字串匹配

1.3如何(在python)使用正則表示式

使用re模組:
這裡寫圖片描述

2.正則表示式的語法

從下面一個經典例子講起:
這裡寫圖片描述
可以看出:正則表示式語法由字元操作符構成

2.1正則表示式的常用操作符

這裡寫圖片描述
這裡寫圖片描述

2.2正則表示式語法例項

這裡寫圖片描述

2.3經典正則表示式例項

這裡寫圖片描述

2.3.1匹配IP地址的正則表示式

這裡寫圖片描述

3.Re庫的基本使用

Re庫是Python的標準庫,主要用於字串匹配
呼叫方式:import re

3.1正則表示式的表示型別

包含2種:raw string型別(原生字串型別)和string型別

re庫採用raw string型別表示正則表示式,表示為: r’text’
例如:

r'[1‐9]\d{5}'
r'\d{3}‐\d{8}|\d{4}‐\d{7}'

簡單來說:raw string是不包含對轉義符再次轉義的字串。

re庫也可以採用string型別表示正則表示式,但更繁瑣
例如:

'[1‐9]\\d{5}'
'\\d{3}‐\\d{8}|\\d{4}‐\\d{7}'

建議:當正則表示式包含轉義符時,使用raw string。而為了使用的方便,筆者還是建議同一用raw string。

關於所有的轉義字元和所對應的意義,可看這裡:
這裡寫圖片描述

3.2Re庫的主要功能函式

總體介紹:
這裡寫圖片描述

3.2.1 re.search()

函式原型:re.search(pattern, string, flags=0)
pattern : 正則表示式的字串或原生字串表示
string : 待匹配字串
flags : 正則表示式使用時的控制標記,常用標記如下:
這裡寫圖片描述

功能:在一個字串中搜尋匹配正則表示式的第一個位置,返回match物件

舉例:
這裡寫圖片描述

3.2.2 re.match()

函式原型:re.match(pattern, string, flags=0),引數同上
pattern : 正則表示式的字串或原生字串表示
string : 待匹配字串
flags : 正則表示式使用時的控制標記

功能:從一個字串的開始位置起匹配正則表示式,返回match物件

舉例:
這裡寫圖片描述

【重要】這裡需要注意的是:當match為None時,直接輸出match.group(0)就會報錯。所以,為了程式的穩定性,通常需要使用:

if match:
    match.group(0)

來避免該錯誤。這種處理方法在爬蟲程式中經常會見到。

3.2.3 re.findall()

函式原型:re.findall(pattern, string, flags=0),引數同上
pattern : 正則表示式的字串或原生字串表示
string : 待匹配字串
flags : 正則表示式使用時的控制標記

功能:搜尋字串,以列表型別返回全部能匹配的子串

舉例:
這裡寫圖片描述

3.2.4 re.split()

函式原型:re.split(pattern, string, maxsplit=0, flags=0)
pattern : 正則表示式的字串或原生字串表示
string : 待匹配字串
maxsplit: 最大分割數,剩餘部分作為最後一個元素輸出
flags : 正則表示式使用時的控制標記

功能:將一個字串按照正則表示式匹配結果進行分割返回列表型別

舉例:
這裡寫圖片描述

3.2.5 re.finditer()

函式原型:re.finditer(pattern, string, flags=0)
pattern : 正則表示式的字串或原生字串表示
string : 待匹配字串
flags : 正則表示式使用時的控制標記
功能:搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件

舉例:
這裡寫圖片描述

3.2.6 re.sub()

函式原型:re.sub(pattern, repl, string, count=0, flags=0)
pattern : 正則表示式的字串或原生字串表示
repl : 替換匹配字串的字串
string : 待匹配字串
count : 匹配的最大替換次數
flags : 正則表示式使用時的控制標記
功能:在一個字串中替換所有匹配正則表示式的子串返回替換後的字串

舉例:
這裡寫圖片描述

3.3Re庫的另一種等價用法

舉例:
這裡寫圖片描述

re.compile函式原型:regex = re.compile(pattern, flags=0)
pattern : 正則表示式的字串或原生字串表示
flags : 正則表示式使用時的控制標記

功能:將正則表示式的字串形式編譯成正則表示式物件

那麼,Re庫的函式用法等價為:
這裡寫圖片描述

4.Re庫的Match物件

Match物件是一次匹配的結果,包含匹配的很多資訊
這裡寫圖片描述

屬性有:
這裡寫圖片描述

方法有:
這裡寫圖片描述

例項:
這裡寫圖片描述

5.Re庫的貪婪匹配和最小匹配

5.1貪婪匹配

首先看一個例子:

>>> match = re.search(r'PY.*N', 'PYANBNCNDN')
>>> match.group(0)

可以發現程式碼中的正則表示式r’PY.*N’可同時匹配長短不同的多項,那麼該返回哪一個呢?
實際輸出結果為:

'PYANBNCNDN'

原因是:Re庫預設採用貪婪匹配,即輸出匹配最長的子串

5.2最小匹配

那麼該如何如何輸出最短的子串呢?
解決方法:修改r'PY.*N'r'PY.*?N'即可:

>>> match = re.search(r'PY.*?N', 'PYANBNCNDN')
>>> match.group(0)
'PYAN'

5.2.1最小匹配操作符

只要長度輸出可能不同的,都可以通過在操作符後增加?變成最小匹配:
這裡寫圖片描述

6.單元小結

這裡寫圖片描述

二、例項1-淘寶商品比價定向爬蟲

1.功能描述

目標:獲取淘寶搜尋頁面的資訊,提取其中的商品(書包)名稱和價格
具體實現需要解決的問題
1.淘寶的搜尋介面:

https://s.taobao.com/search?q=keyword

第一個頁面的連結為:

https://s.taobao.com/search?q=書包&js=1&stats_click=search_radio_all%
3A1&initiative_id=staobaoz_20170105&ie=utf8

2.翻頁的處理:
開啟網頁後,發現數據是分佈在多個頁面上的:
這裡寫圖片描述

一般來說,這多個頁面的連結是有一定的規律性的:
這裡寫圖片描述

可以看到,修改s這個屬性值就可以得到後面的頁面的URL連結了。

3.技術路線:requests‐bs4‐re

4.觀察網頁原始碼,找到要爬取的資料(書包的價格和名稱)的所在位置:
這裡寫圖片描述

2.程式結構設計

步驟1:提交商品搜尋請求,迴圈獲取頁面
步驟2:對於每個頁面,提取商品名稱和價格資訊
步驟3:將資訊輸出到螢幕上

首先,寫出總體較抽象的程式碼:
這裡寫圖片描述

總體程式碼:

#CrowTaobaoPrice.py
import requests
import re

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "failed\n"

def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
        tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])#eval函式將字串轉為數字
            title = eval(tlt[i].split(':')[1])
            ilt.append([price , title])
    except:
        print("")

def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}"
    print(tplt.format("序號", "價格", "商品名稱"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count, g[0], g[1]))

def main():
    goods = '書包'
    depth = 3 #改段程式碼是演示用的,depth不能太大,淘寶本是不允許爬取搜尋頁面的
    start_url = 'https://s.taobao.com/search?q=' + goods
    infoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(44*i)
            html = getHTMLText(url)
            parsePage(infoList, html)
        except:
            continue
    printGoodsList(infoList)

main()

輸出結果:

序號    價格            商品名稱
   1    129.00          瑞士軍刀旅行雙肩包男中學生書包電腦揹包
   2    69.00           迪士尼書包小學生男女1-3-4-6年級米奇減負揹包兒童書包8-10-123    78.00           泰格奴防盜商務男女雙肩包男士揹包休閒學生書包電腦包韓版旅行包
   4    143.00          七匹狼男士揹包 書包中學生男商務雙肩電腦包旅行包 揹包雙肩包男
   5    79.00           日韓大容量帆布雙肩包男潮雙肩揹包旅行包英倫風書包中學生女
   6    167.00          越古帆布雙肩包女士休閒復古文藝運動揹包韓版中學生書包男包女包
   7    37.44           日韓簡約清新帆布雙肩包女韓版潮學院風校園學生揹包大小款書包女
   8    69.00           2016新款韓版潮真皮揹包時尚女士雙肩包女百搭簡約大容量學生書包
   9    44.55           包包2017新款pu卡通小貓雙肩包女韓版時尚百搭學院風學生書包揹包
  10    55.00           雙肩包女士包包2017新款學生揹包時尚韓版媽咪女包休閒書包旅行包
  11    49.90           雙肩包女士揹包2017春季新款女包時尚百搭書包韓版休閒旅行包女潮
  12    79.20           幼兒園布朗熊書包3-4-5歲 揹包雙肩包 手提包韓國熱款 輕便容量大
  13    59.00           2016新款個性創意磨砂皮海豚書包女雙肩包男大容量旅行揹包電腦包
  14    198.00          SALONBUS沙隆巴斯 定製款復古英倫老花迷你小書包雙肩揹包斜挎包
  15    145.00          雙肩包男士揹包旅遊韓版學生書包時尚潮流休閒旅行潮包皮質電腦包
  16    97.51           超值卡拉羊韓版學院風女雙肩包大學生初中生中學生書包女旅行電腦
  17    159.00          SHEVAN/希梵2016新款時尚女包雙肩包女韓版百搭休閒揹包簡約書包
  18    12.50           韓國版文藝2017簡約帆布包男女單肩手提購物袋大女包學生書包森潮
  19    99.36           米菲包包女小清新雙肩包女學院風中學生書包帆布旅行揹包大容量
  20    98.00           2017女包上新款韓版潮雙肩包女牛津布小怪獸揹包時尚學院風書包
  21    111.72          2017新款英倫時尚簡約雙肩包女包韓版潮流大揹包學院風學生書包包
  22    22.98           包郵秋冬文藝純色布貼燈芯絨布包單肩斜跨兩用拉鍊包女書包9色入
  23    139.00          安踏配件雙肩揹包男女通用 春秋季膝上型電腦包學生書包揹包
  24    58.65           韓版多功能單肩雙肩兩用媽咪包大容量揹包牛津布配真皮斜挎大書包
  25    73.50           馬塞洛雙肩包男士韓版商務揹包女中學生書包雙肩休閒電腦包旅行包
  26    59.00           樂天雙肩包日系校園森女系撞色拼接大容量書包男女情侶揹包電腦包
  27    99.00           安踏男女雙肩揹包學生書包2016冬季新款時尚百搭旅遊揹包19648166
  28    79.00           費萊德簡約男包韓版學生書包女包潮PU皮男士雙肩揹包休閒旅行包
  29    108.00          熊本熊包包學生包jk制服包女單肩書包可愛日系手提包通勤學院風萌
  30    75.00           勇士庫裡30號 湯普森 大容量雙肩包籃球揹包 男 女包 學生書包nba
  31    98.58           牛津布雙肩包女日韓版時尚防水帆布揹包韓國校園大學生休閒書包男
  32    47.90           雙肩包女韓版潮青少年休閒可愛揹包百搭簡約旅遊灰粉色學生書包女
  33    76.00           伊布雅雙肩包女日韓版男揹包純色百搭中學生書包休閒電腦包旅行包
  34    19.90           2016韓版親子包兒童雙肩揹包胸包寶寶男童女童米奇皮包書包潮包
  35    58.00           2016新款歐美雙肩包女韓版可愛卡通創意個性噴繪揹包中學生書包男
  36    125.00          七匹狼新款雙肩包韓版男女休閒揹包學生書包商務電腦包旅行包正品
  37    39.90           綵帶流蘇雙肩包女2016新款鉚釘徽章迷你小揹包學院風休閒單肩書包
  38    89.76           2017新款尼龍牛津布雙肩包女包韓版潮輕休閒揹包學生書包媽咪大包
  39    77.52           2016新款春鉚釘雙肩包女韓版pu學院風2017小熊揹包休閒百搭書包潮
  40    49.90           2016新款韓版雙肩包女復古PU揹包潮百搭學院風旅行休閒中學生書包
  41    59.00           秀洛我的世界Minecraft苦力怕書包遊戲周邊雙肩揹包男女學生夜光
  42    79.00           森馬雙肩包女韓版 2016新款簡約百搭學院風大學生書包男電腦包潮
  43    59.00           2017新款牛津布雙肩包女夏尼龍佈防水書包女士休閒旅行揹包韓版潮
  44    38.00           瑞士軍刀SWISSWIN兒童書包小孩雙肩包卡通揹包SWK1001A/B/C/D/E/F
  45    59.90           包包女2017新款潮韓版百搭學院鉚釘揹包簡約PU書包韓版雙肩包小包
  46    69.00           百搭明星新款雙肩包軟皮女包韓版學院風休閒時尚書包旅行揹包潮女
  47    146.51          JanSport傑斯伯超級叛逆兒童款迷你雙肩包書包TDH6系列
  48    59.00           揹包雙肩包男韓版大學生高中學生開學書包時尚潮流旅行旅遊包簡約
  49    69.00           雙肩包女韓版潮書包2017新款時尚百搭軟羊皮女士包包旅行真皮揹包
  50    258.00          NIKE雙肩包KYRIE 歐文男子籃球運動裝備揹包書包BA5133 BA5259
  51    179.00          匡威包雙肩包男包女包2017圖案學生書包運動帆布揹包10004349-A01
  52    119.00          【買一送一】森馬雙肩包女韓版 百搭學院風大學生書包男旅行包潮
  53    248.00          anello雙肩包日本代購正品樂天男女書包包兩用揹包簡約書包防水包
  54    39.90           2016秋冬新款尼龍雙肩包女揹包牛津布包女士韓版潮書包女包方扣
  55    158.00          開學季包郵訂製圖案炫彩硬殼電腦包18寸中學生高中生書包
  56    28.50           韓國軟妹燈芯絨雙肩包原宿復古百搭學院風帆布日系男女學生書包潮
  57    116.82          韓國復古個性書包女雙肩包防潑水大學韓版學院風bf布料女小清新男
  58    109.00          日本代購樂天雙肩包磨砂手提包大容量電腦揹包媽咪學生書包旅遊包
  59    30.24           新款時尚休閒防潑水書包女中學生旅行雙肩包 學院風潮流印花揹包
  60    218.00          GOLF新品男士雙肩包時尚多色旅行揹包大學生書包電腦包悠閒包包
  61    47.36           雙肩包女韓版2017新款潮百搭休閒皮質大學生書包簡約氣質女生揹包
  62    277.00          正品匡威休閒雙肩包男女學生書包旅行包 10002205102 10002205001
  63    99.00           2017新款鯊魚大小揹包牛津布雙肩包女學生男女書包旅行包
  64    165.00          2016正品阿迪達斯男女包學生書包雙肩揹包AY4200 4183 4184 4199
  65    79.00           冰雪奇緣兒童書包可愛雙肩包女童8-10-12歲小學生書包3-4-6年級
  66    37.00           貓貓包袋2017女包上新多用雙肩包休閒拼色單肩斜挎包包女日韓書包
  67    58.00           書包男女學生陰陽師動漫遊戲周邊神樂安培晴明瑩草大天狗雙肩揹包
  68    29.90           韓國ulzzang日本原宿軟妹美少女戰士露娜貓咪賣萌小號雙肩背書包
  69    49.90           小學生書包1-2-3年級4男孩雙肩揹包女兒童 6-7-8-9歲休閒旅行防水
  70    22.90           韓國經典百搭黑色刺繡雙肩包月亮十字架學生揹包大容量情侶書包女
  71    45.22           2017新款磨砂流蘇雙肩包女韓版大容量學院風揹包百搭休閒學生書包
  72    69.00           小惡魔小怪獸潮牌雙肩包韓版男女初高中學生情侶書包夜光帆布包
  73    49.90           戶外登山包大容量書包潮女韓版多功能旅行揹包運動雙肩包男行李包
  74    88.00           女雙肩包復古歐美學生書包休閒揹包電腦包碎花
  75    39.90           雙肩包女韓版pu揹包時尚百搭女包學院風抽繩包包2016新款潮書包女
  76    118.00          韓國kk樹書包小學生男6-12週歲兒童書包女童1-3-5年級護脊雙肩包
  77    79.00           卡拉羊兒童小揹包寶寶幼兒園書包男女小雙肩包可愛卡通小包C6005
  78    139.00          輕便防水中號揹包雙肩包多袋多功能多花色 書包
  79    59.40           雙肩包男個性學生書包時尚潮流簡約旅行揹包皮商務休閒防水電腦包
  80    59.00           休閒雙肩包女士揹包學院風韓版學生書包時尚潮復古旅行電腦包潮包
  81    65.00           牛津布全防水包包女生書包韓版學院風揹包簡約百搭學生雙肩包帆布
  82    45.00           李小璐同款雙肩包女旅行包2016春夏款亮片揹包女包韓版潮亮片書包
  83    68.16           雙肩包女包韓版PU皮全防水大容量高中學生書包流蘇揹包校園學院風
  84    179.00          瑞戈瑞士軍刀男女揹包雙肩包旅行包中學生書包休閒商務時尚包
  85    59.00           休閒雙肩包男士揹包青年PU皮韓版潮流學生書包時尚大旅行包電腦包
  86    19.80           韓版揹包摺疊輕便防水女旅行男旅遊戶外雙肩包簡約百搭學院風書包
  87    99.00           奧王雙肩包揹包男初中生學生書包休閒男士商務旅行大容量電腦包
  88    23.00           2016新款雙肩包揹包韓版時尚女包大容量女士包包簡約雙肩學生書包
  89    79.00           黛妃洛 秋冬新品編織雙肩包女士包時尚潮揹包旅行大容量女包書包
  90    41.80           韓版簡約時尚休閒鐳射pu雙肩揹包女中學生校園書包大容量百搭純色
  91    168.00          左岸瀟明星同款潮牌雙肩包菱格子品牌書包學生超輕便尼龍旅行揹包
  92    59.00           阪元宿宿大容量印花防水雙肩包女韓版潮休閒揹包中學生書包旅行包
  93    99.00           瑞士軍刀正品雙肩包男商務15.6寸電腦包17寸中學生書包大容量揹包
  94    369.00          艾力夫|NEW BALANCE GC721032 GC641013 男女包運動包書包雙肩包
  95    49.90           新款雙肩包女韓版pu皮森女系學院風學生書包小清新休閒百搭揹包潮
  96    49.00           雙肩包女韓版學院風定型貓耳朵防水雙肩大高中學生男書包百搭揹包
  97    49.00           【天天特價】戶外登山包大容量旅行旅遊揹包雙肩包男女運動包書包
  98    137.70          JTXS正版鑲鑽亮片雙肩揹包女韓版明星同款亮片雙肩背潮流旅遊書包
  99    136.08          ONLY雙肩包女包2017新款韓版個性鉚釘揹包時尚書包潮流包包108
 100    74.75           2017新款休閒旅行軟皮配牛皮揹包雙肩包韓版潮女包學院風學生書包
 101    1568.00         美國正品新款MK雙肩包RHEA ZIP鉚釘書包旅行揹包真皮中號小號男女
 102    872.00          美國代購蔻馳COACH新款迷你雙肩小書包女揹包F38395 38302 38263
 103    35.00           單肩斜挎包加厚休閒布包大書包旅行包防水尼龍女包袋
 104    27.90           兒童揹包韓版中大童布小學生書包男孩時尚休閒旅行男童雙肩包潮包
 105    13.90           韓版冬季新款揹包女包學生雙肩包旅行包中小學書包大容量學生雙背
 106    48.00           女包雙肩包pu復古子母包多功能揹包日韓風旅行潮包學院風學生書包
 107    79.00           雙肩包男帆布旅行揹包韓版百搭高中大學生書包女時尚潮流個性街頭
 108    88.00           雙肩包男定製 電腦包揹包 學生書包旅行揹包定做logo
 109    59.00           特價軟皮雙肩包女韓版揹包簡約包包學院風皮質女生書包休閒旅行包
 110    88.00           Carney Road卡尼路軍雙肩包電腦包韓版潮運動旅行包高中學生書包
 111    69.99           13寸手提電腦包男女軍迷戰術雙肩包防水迷彩揹包旅行單肩斜挎書包
 112    45.00           死神 書包 雙肩包 周邊 揹包 包包 動漫 黑崎一護 BLEACH 冬獅郎
 113    39.00           黑白條紋雙肩包揹包女撞色學生書包帆布旅行包回家包日韓版情侶包
 114    45.00           2016新款潮時尚小香風女包尼龍牛津布包雙肩書包單肩斜挎旅行揹包
 115    55.00           牛津布雙肩包男生韓版帆布揹包時尚書包學院風旅行包新款潮書包包
 116    35.00           Aape 猿人頭 韓版英倫拼色學院風帆布雙肩包男人書包揹包時尚潮流
 117    39.60           雙肩包女包韓版皮料書包時尚百搭單肩包女士包包2017新款潮後背包
 118    99.00           歐美復古雙肩包女生學院風揹包PU皮大容量書包潮高中 大學生書包
 119    39.48           韓版雙肩包男女簡約休閒初中小學生書包帆布潮學院風旅行電腦揹包
 120    39.90           韓國代購水桶雙肩包女韓版潮純色防水揹包學生書包大容量旅行包
 121    449.00          代購直郵16新款歐美休閒百搭guess柳釘雙肩包女包書包包郵
 122    69.00           安踏書包揹包春季皮革雙肩揹包休閒日韓學院雙肩包19618158
 123    99.00           安踏雙肩揹包學生書包2016夏季新款戶外運動旅行電腦包|19628159
 124    48.00           郵暴走大事件書包王尼瑪暴走漫畫個性搞笑男女揹包雙肩包原宿星空

三、例項2-股票資料定向爬蟲

1.功能描述

目標:獲取上交所和深交所所有股票的名稱和交易資訊
輸出:儲存到檔案中
技術路線:requests‐bs4‐re

2.資料網站的選擇

選擇方法:
選取原則:股票資訊靜態存在於HTML頁面中,非js程式碼生成,沒有Robots協議限制
選取方法:瀏覽器 F12,原始碼檢視等
選取心態:不要糾結於某個網站,多找資訊源嘗試

測試結果:
由於東方財富網有所有股票的列表,所有股票的名稱和代號都可以在一個頁面上找到:
這裡寫圖片描述
檢視原始碼後,可以看到股票名稱和代號是有規律的。
這裡寫圖片描述
然而點進去某個具體頁面後發現數據採取不方便,頁面比較繁雜。

測試百度股票後,發現可以直接通過股票代號來直接查詢得到股票具體資訊:
這裡寫圖片描述

例如查詢啟明星辰這支股票:
這裡寫圖片描述
我們需要抓取的資料就是上面這些。檢視原始碼後可以發現數據是靜態存在於HTML頁面中的。
這裡寫圖片描述

3.程式的結構設計

步驟1:從東方財富網獲取股票列表
步驟2:根據股票列表逐個到百度股票獲取個股資訊
步驟3:將結果儲存到檔案

首先,編寫較為抽象的程式碼:
這裡寫圖片描述

getStockList函式的實現:
上面提到,股票的代號資訊是在網頁原始碼的a標籤的href屬性值上的,因此可通過正則表示式來提取。這裡選擇正則表示式為:r"[s][hz]\d{6}"(之所以不是r"[s][h]\d{6}"的原因見下面第二週圖片)。
這裡寫圖片描述
將網頁向下滑動一段時間後,發現href屬性值的程式碼起那麼的兩個字母sh改成了sz了。(實際上兩者分別是上海和深圳的簡寫)。
這裡寫圖片描述
程式碼:

def getStockList(stockList, stockURL):
    html = getHTMLText(stockURL)
    soup = BeautifulSoup(html, 'html.parser') 
    #股票名稱和代號在網頁原始碼的a標籤的href屬性上
    a = soup.find_all('a')
    for i in a:
        try:
            href = i.attrs['href']
            stockList.append(re.findall(r"[s][hz]\d{6}", href)[0])
        except:
            continue

getStockInfot函式的實現:
由下面看到的原始碼中:
這裡寫圖片描述
可見資料是在<div class="bets-content">...</div>這個div標籤內。
而下面這張圖片的資料則是儲存在上面的原始碼的dt和dd標籤上。
這裡寫圖片描述
程式碼:

def getStockInfo(stockList, stockURL, fpath):
    for stock in stockList:
        url = stockURL + stock + ".html" #個股的詳細查詢頁面
        html = getHTMLText(url)
        try:
            if html == "":#異常判斷
                continue
            infoDict = {}
            soup = BeautifulSoup(html, 'html.parser')
            #找到第一個class屬性值為stock-bets的div標籤
            stockInfo = soup.find('div', attrs={'class': 'stock-bets'})

            if stockInfo==None:#異常判斷
                continue
            #找到第一個class屬性值為bets-name的a標籤
            name = stockInfo.find('a',attrs={'class': 'bets-name'})
            #得到股票名稱
            infoDict.update({'股票名稱': name.text.split()[0]})
            #通過閱讀網頁原始碼,發現數據可用鍵值對的形式儲存
            #找到所有dt標籤(資料鍵值對的鍵)
            keyList = stockInfo.find_all('dt')
            #找到所有dd標籤(資料鍵值對的值)
            valueList = stockInfo.find_all('dd')
            for i in range(len(keyList)):
                key = keyList[i].text
                val = valueList[i].text
                infoDict[key] = val
            #將新增資料新增到檔案
            with open(fpath, 'a', encoding='utf-8') as f:
                f.write(str(infoDict))
        except:
            #列印異常資訊,這樣的做法是 即是出現了異常,異常資訊可以顯示出來,但是程式仍會接著進行
            traceback.print_exc()
            continue

總體程式碼:

# CrawBaiduStocksA.py
import requests
from bs4 import BeautifulSoup
import traceback
import re

def getHTMLText(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

def getStockList(lst, stockURL):
    html = getHTMLText(stockURL)
    # 股票名稱和代號在網頁原始碼的a標籤的href屬性上
    soup = BeautifulSoup(html, 'html.parser')
    a = soup.find_all('a')
    for i in a:
        try:
            href = i.attrs['href']
            lst.append(re.findall(r"[s][hz]\d{6}", href)[0])
        except:
            continue

def getStockInfo(stockList, stockURL, fpath):
    for stock in stockList:
        url = stockURL + stock + ".html" #個股的詳細查詢頁面
        html = getHTMLText(url)
        try:
            if html == "":#異常判斷
                continue
            infoDict = {}
            soup = BeautifulSoup(html, 'html.parser')
            #找到第一個class屬性值為stock-bets的div標籤
            stockInfo = soup.find('div', attrs={'class': 'stock-bets'})

            if stockInfo==None:#異常判斷
                continue
            #找到第一個class屬性值為bets-name的a標籤
            name = stockInfo.find('a',attrs={'class': 'bets-name'})
            #得到股票名稱
            infoDict.update({'股票名稱': name.text.split()[0]})
            #通過閱讀網頁原始碼,發現數據可用鍵值對的形式儲存
            #找到所有dt標籤(資料鍵值對的鍵)
            keyList = stockInfo.find_all('dt')
            #找到所有dd標籤(資料鍵值對的值)
            valueList = stockInfo.find_all('dd')
            for i in range(len(keyList)):
                key = keyList[i].text
                val = valueList[i].text
                infoDict[key] = val
            #將新增資料新增到檔案
            with open(fpath, 'a', encoding='utf-8') as f:
                f.write(str(infoDict))
        except:
            #列印異常資訊,這樣的做法是 即是出現了異常,異常資訊可以顯示出來,但是程式仍會接著進行
            traceback.print_exc()
            continue

def main():
    # 股票列表頁面(可得到所有股票代號和名稱)
    stock_list_url = 'http://quote.eastmoney.com/stocklist.html'
    # 個股詳細查詢頁面(根據股票代號可查詢)
    stock_info_url = 'https://gupiao.baidu.com/stock/'
    # 儲存爬取資料的檔案
    output_file = 'BaiduStockInfo.txt'
    # 股票列表
    stockList = []
    # 得到股票列表
    getStockList(stockList, stock_list_url)
    # 得到所有個股的詳細資訊,並儲存在輸出檔案
    getStockInfo(stockList, stock_info_url, output_file)

main()

4.例項優化

優化目的:提高使用者體驗

4.1getHTMLText函式的編碼識別的優化

def getHTMLText(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

getHTMLText函式中的r.apparent_encoding需要分析文字,執行較慢,可輔助人工分析。
修改為:

def getHTMLText(url, code="utf-8"):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = code
        return r.text
    except:
        return ""

並修改getStockList中呼叫getHTMLText的部分程式碼,修改後如下:


            
           

相關推薦

MOOCPython網路爬蟲資訊提取-北京理工大學-part 3

【第三週】網路爬蟲之實戰 一、Re(正則表示式)庫入門 1.正則表示式的概念 1.1正則表示式是什麼 正則表示式是用來簡潔表達一組字串的表示式。 使用正則表示式的優勢就是:簡潔、一行勝千言 一行就是特徵(模式) 例1:代表一組字串:

MOOCPython網路爬蟲資訊提取-北京理工大學-part 4

網路爬蟲之框架 1.scrapy爬蟲框架介紹 1.1.scrapy爬蟲框架介紹 安裝方法: 簡要地說,Scrapy不是一個函式功能庫,而是一個快速功能強大的網路爬蟲框架。 (爬蟲框架是實現爬蟲功能的一個軟體結構和功能元件集合,是一個半成品,

MOOCPython網路爬蟲資訊提取-北京理工大學-part 1

【第〇周】網路爬蟲之前奏 網路爬蟲”課程內容導學 【第一週】網路爬蟲之規則 1.Requests庫入門 注意:中文文件的內容要稍微比英文文件的更新得慢一些,參考時需要關注兩種文件對應的Requests庫版本。(對於比較簡單的使

MOOCPython網路爬蟲資訊提取-北京理工大學-part 2

【第二週】 網路爬蟲之提取 Beautiful Soup庫入門 Beautiful Soup庫的安裝與測試 <html><head><title>This is a python demo page<

Python網路爬蟲資訊提取(中國大學mooc

目錄 Python網路爬蟲與資訊提取 淘寶商品比價定向爬蟲 股票資料定向爬蟲 1. 淘寶商品比價定向爬蟲 功能描述 目標:獲取淘寶搜尋頁面的資訊 理解:淘寶的搜尋介面翻頁的處理 技術路線:requests

Python網路爬蟲資訊提取Day2

Python網路爬蟲與資訊提取 一、導學 掌握定向網路資料爬取和網頁解析的基本能力 1、Requests庫:自動爬取HTML頁面,自動向網路提交請求 2、robots.txt:網路爬蟲排除標準 3、Beautiful Soup庫:解析HTML頁面 4、Projects:實戰專案A/B 5、Re庫:正

Python網路爬蟲資訊提取Day1

Python網路爬蟲與資訊提取 一、導學 掌握定向網路資料爬取和網頁解析的基本能力 1、Requests庫:自動爬取HTML頁面,自動向網路提交請求 2、robots.txt:網路爬蟲排除標準 3、Beautiful Soup庫:解析HTML頁面 4、Projects:實戰專案A/B 5、Re庫:正

嵩天教授的Python網路爬蟲資訊提取課程筆記——單元1. requests庫入門

本文目錄 Requests庫介紹 requests.get(url, params, **kwargs)方法及其他請求方法介紹 Response類屬性簡介 Reponse類中的encoding與app

Python網路爬蟲資訊提取_爬蟲例項(學習筆記)

慕課課程學習筆記 1. 京東商品頁面的爬取  1.採用get()方法,獲取Response物件; import requests url = 'https://item.jd.com/100000947807.html' r = requests.get(url)

Python網路爬蟲資訊提取(三)bs4入門

  Python的requests庫可以幫助我們獲取到大量的資訊,而如果想對這些資訊進行提取與分析,則經常使用beautifulsoup這個用來解析HTML和XML格式的功能庫。  beautifulsoup庫的安裝和requests的流方法一樣,可直接在cmd中輸入pip

Python網路爬蟲資訊提取-Day14-(例項)股票資料定向爬蟲

功能描述 目標:獲取上交所和深交所所有股票的名稱和交易資訊 股票資料是進行量化交易的基礎型資料,此爬蟲也能為量化交易提供獲得基礎資料的方法 輸出:儲存到檔案中 技術路線:requests‐bs4‐re 候選資料網站的選擇 百度股票:https://gupiao.baidu

Python網路爬蟲資訊提取-Day5-Requests庫網路爬取實戰

一、京東商品頁面的爬取 先選取一個商品頁面 直接利用之前的程式碼框架即可 import requests url = "https://item.jd.com/12186192.html" try: r = requests.get(url) r.raise_for

Python網路爬蟲資訊提取-Day9-資訊標記提取方法

一、資訊標記的三種形式 我們需要對資訊進行表記,使得我們能夠理解資訊所反饋的真實含義。 標記後的資訊可形成資訊組織結構,增加了資訊維度 標記的結構與資訊一樣具有重要價值 標記後的資訊可用於通訊、儲存或

python網路爬蟲資訊提取(四)Robots協議

Robots協議  例項一京東 例項二亞馬遜緒論 網路爬蟲引發的問題1、網路爬蟲的尺寸爬取網頁 Requests庫爬取網站 Scrapy庫爬取全網 建立搜尋引擎2、網路爬蟲引發的問題1.伺服器效能騷擾2.法律風險3.洩露隱私3、網路爬蟲的限制來源審查:判斷User-Agent

j記錄學習--python網路爬蟲資訊提取

The website is the API...要獲取網站內容,只要把網站當成API就可以了。 requests庫獲取網頁資訊---》Beautiful Soup解析提取到資訊的內容---》利用re庫正則表示式提取其中某部分的關鍵資訊----》Scrapy*網路爬蟲 網路

Python網路爬蟲資訊提取(五)資訊標記資訊提取的一般方法

目前國際公認的資訊標記種類共有如下三種:名稱方式例項XML(eXtensible Markup Language)基於HTML的用有名稱與屬性的標籤進行標記的方式<name>...</name>     <name />    <!-

Python 爬蟲基礎學習--網路爬蟲資訊提取

Python 爬蟲基礎學習 Requests庫的安裝 Win平臺: “以管理員身份執行”cmd,執行 pip install requests Requests庫的7個主要的方法 Requests庫中2個重要的物件:Request和Response Response物件

MOOCPython資料分析展示-北京理工大學-第〇周資料分析之前奏

課程內容導學 主題思想 與一組資料相關的那些事兒: 如何理解一組資料表達的含義 有損地提取資料特徵 內容組織 全課程包括: • 8個內容單元,共12個單元 • 全課程總長4周,每週3個單元 • 每週包含一個實戰型例項 程式

MOOCPython資料分析展示-北京理工大學-第一週資料分析之表示

單元一:NumPy庫入門 1.1 資料的維度 維度:一組資料的組織形式 一維資料 一維資料由對等關係的有序或無序資料構成,採用線性方式組織,對應列表、陣列和集合等概念 如:3.1413, 3.1398, 3.1404, 3.1401, 3.13

MOOCPython資料分析展示-北京理工大學-第三週資料分析之概要

概要:提取資料的基本特徵 單元7:pandas庫入門 Pandas是Python第三方庫,提供高效能易用資料型別和分析工具,Pandas基於NumPy實現,常與NumPy和Matplotlib一同使用。 常用引用方法: import pandas