1. 程式人生 > >十三、原生爬蟲實戰

十三、原生爬蟲實戰

enc pri 實例 vid 唯一標識 ext 聯盟 info 目標

一、簡單實例

1、需求:爬取熊貓直播某類主播人氣排行

2、了解網站結構

分類——英雄聯盟——"觀看人數"

3、找到有用的信息

技術分享圖片

二、整理爬蟲常規思路

1、使用工具chrome——F12——element——箭頭——定位目標元素

目標元素:主播名字,人氣(觀看人數)

技術分享圖片

2、方法:使用正則表達式提取有用的信息

主播名字,人氣(觀看人數)

總結

  • 爬蟲前奏

1)明確目的

2)找到數據對應的網頁

3)分析網頁的結構找到數據所在的標簽位置

  • 步驟

1)模擬HTTP請求,向服務器發送這個請求,獲取到服務器返回給我們的HTML

2)用正則表達式提取我們要的數據(名字,人氣)

三、HTML結構分析基本原則

1、爬蟲分析,最重要的一步,找到標簽(即左右邊界)

原則:

1)盡量選擇有唯一標識性的標簽

2)盡量選擇離目標信息最近的標簽

不同人選擇的標簽可能不同。

四、數據提取層級及原則

1、找到最近的定位標簽(肉眼可見)

有關聯的信息作為一組,找離這一組最近的定位標簽

如:示例中的“主播姓名”和“人數”是有關聯的,作為一組

2、判斷選擇的標簽是否是唯一的(需代碼驗證)

3、盡量選擇可閉合的定位標簽

可閉合,是指可將目標信息包裹起來的定位標簽。如:<... />

技術分享圖片

技術分享圖片

4、代碼實戰

 1 # coding=utf-8
 2 import re
 3 from urllib import request
 4 
 5 url = https://www.panda.tv/all 6 r = request.urlopen(url)
 7 htmls = r.read()
 8 
 9 print(type(htmls))  # 打印type,結果是bytes類型
10 htmls = str(htmls, encoding=utf-8‘)  # 將bytes轉成utf-8
11 print(htmls)

運行結果

Traceback (most recent call last):
  File "E:/pyClass/thirtheen/spider.py", line 12, in <module>
    print(htmls)
UnicodeEncodeError: gbk‘ codec cant encode character ‘\xa0 in position 62321: illegal multibyte sequence

原因是使用的print()是win7系統的編碼,但是win7系統的默認編碼是GBK,解決方式,增加如下代碼

1 import io
2 import sys
3 sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding=gb18030‘)

優化後代碼

# coding=utf-8
import re
from urllib import request
import io
import sys
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding=gb18030)

class Spider():

    url = https://www.panda.tv/all

    def __fetch_content(self):
        r = request.urlopen(Spider.url)
        htmls = r.read()
        htmls = str(htmls, encoding=utf-8)  # 將bytes轉成utf-8
        print(htmls)
        return htmls


    def go(self):
        self.__fetch_content()



spider=Spider()
spider.go()

五、正則分析HTML

1、獲取root_html

正則表達式匹配<div class="video-info">和</div>之間的所有字符,有哪些方式?

技術分享圖片

匹配所有字符的方式

1)[\s\S]*?

2)[\w\W]*?

* 表示任意次

?表示貪婪

2、代碼實戰

十三、原生爬蟲實戰