十三、原生爬蟲實戰

一、簡單實例

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

2、了解網站結構

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

3、找到有用的信息

二、整理爬蟲常規思路

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

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

?

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

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

總結

  • 爬蟲前奏

1)明確目的

2)找到數據對應的網頁

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

  • 步驟

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

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

二、斷點調試

我們以如下的一種常見錯誤,來演示如何通過PyCharm斷點追蹤的方式發現程序中的錯誤:

def foo(bar=[]):bar.append('bar') return bar >>>foo() ['bar'] >>>foo() ['bar', 'bar'] >>>foo() ['bar', 'bar', 'bar']

這里存在一個常見的錯誤就是誤以為:函數在每次不提供可選形參時將參數設置為默認值,也就是本例中的[],一個空的list。

這里我們便可以通斷點調試的方式進行追蹤,在每次函數調用(不顯示傳遞形參)時,觀察形參值的變化。
如圖所示為:


這里寫圖片描述

下圖是以這段為例,來演示如何發現程序中的bug:

這里寫圖片描述

解決方案:

def foo(bar=None):if not bar: bar = [] bar.append('baz') return bar >>>foo() ['baz'] >>>foo() ['baz']

三、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 can't 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-8print(htmls)return htmlsdef 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、代碼實戰

?

 1 # coding=utf-8
 2 from urllib import request
 3 import re
 4 import io
 5 import sys
 6 sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
 7 
 8 #以下代碼解決SSL報錯
 9 import ssl
10 ssl._create_default_https_context = ssl._create_unverified_context
11 
12 
13 class Spider():
14 
15     #定義類變量
16     url = 'https://www.panda.tv/all'
17     root_html='<div class="video-info">([\s\S]*?)</div>'  #([\s\S]*?)匹配任意字符
18 
19     #獲取服務器響應內容
20     def __fetch_content(self):
21 
22         r=request.urlopen(url=Spider.url)
23         htmls = r.read()
24         htmls = str(htmls, encoding='utf-8')  # 將bytes轉成utf-8
25         return htmls
26 
27     #分析并獲取元素
28     def __analysis(self,htmls):
29         root_html=re.findall(Spider.root_html,htmls)
30         return root_html
31 
32 
33     def go(self):
34         htmls=self.__fetch_content()
35         self.__analysis(htmls)
36 
37 
38 spider=Spider()
39 spider.go()

遇到的問題:

1)亂碼

參考python的編碼問題整理

2)SSL錯誤

加入如下代碼

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

?

3)類變量的引用

Spider.root_html

六、數據精煉

正則分析獲取名字和人數

1、找到名字的左右邊界、找到人數的左右邊界

2、使用正則匹配,從root_html中獲取名字和人數,并拼接成字典格式,列表接收

3、數據精煉——去掉多余的換行和空格(如果有),將value列表轉化為str

代碼示例:

 1 # coding=utf-8
 2 from urllib import request
 3 import re
 4 import io
 5 import sys
 6 
 7 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
 8 
 9 # 以下代碼解決SSL報錯
10 import ssl
11 
12 ssl._create_default_https_context = ssl._create_unverified_context
13 
14 
15 class Spider():
16     # 定義類變量
17     url = 'https://www.panda.tv/all'
18     root_html = '<div class="video-info">([\s\S]*?)</div>'  # ([\s\S]*?)匹配任意字符
19     name_pattern = '<span class="video-title" title="([\s\S]*?)">'
20     number_pattern = '<span class="video-number">([\s\S]*?)</span>'
21 
22     # 獲取服務器響應內容
23     def __fetch_content(self):
24         r = request.urlopen(url=Spider.url)
25         htmls = r.read()
26         htmls = str(htmls, encoding='utf-8')  # 將bytes轉成utf-8
27         return htmls
28 
29     # 分析并獲取元素
30     def __analysis(self, htmls):
31         anchors = []  # 使用list接收
32         root_html = re.findall(Spider.root_html, htmls)
33         for html in root_html:
34             name = re.findall(Spider.name_pattern, html)
35             number = re.findall(Spider.number_pattern, html)
36             anchor = {'name': name, 'number': number}  # 組合成需要的字典格式
37             anchors.append(anchor)
38 
39         return anchors
40 
41     # 數據精煉——去掉多余的內容,轉成需要的格式
42     def __refine(self, anchors):
43         l = lambda anchor: {'name': anchor['name'][0], 'number': anchor['number'][0]}  # 上一步得到的name和number是列表類型,需要轉成str
44         return map(l, anchors)
45 
46 
47     def go(self):
48         htmls = self.__fetch_content()
49         anchors = self.__analysis(htmls)
50         anchors=list(self.__refine(anchors))
51         print(anchors)
52 
53 
54 spider = Spider()
55 spider.go()

九、業務處理——排序

?

轉載于:https://www.cnblogs.com/loveapple/p/9408611.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388949.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

歸一化 均值歸一化_歸一化折現累積收益

歸一化 均值歸一化Do you remember the awkward moment when someone you had a good conversation with forgets your name? In this day and age we have a new standard, an expectation. And when the expectation is not met the feeling is not far off being asked “w…

sqlserver垮庫查詢_Oracle和SQLServer中實現跨庫查詢

一、在SQLServer中連接另一個SQLServer庫數據在SQL中&#xff0c;要想在本地庫中查詢另一個數據庫中的數據表時&#xff0c;可以創建一個鏈接服務器&#xff1a;EXEC master.dbo.sp_addlinkedserver server N別名, srvproductN庫名,providerNSQLOLEDB, datasrcN服務器地址EXEC…

Angular2+ typescript 項目里面用require

在typescript里面怎么使用require方法呢&#xff1f; const jQuery require(jquery); const fip require( fonticonpicker/fonticonpicker )( jQuery ); 如果什么都不做&#xff0c;直接在項目里面使用&#xff0c;會得到以下錯誤&#xff1a; Cannot find name require 以下…

機器學習實踐三---神經網絡學習

Neural Networks 在這個練習中&#xff0c;將實現神經網絡BP算法,練習的內容是手寫數字識別。Visualizing the data 這次數據還是5000個樣本&#xff0c;每個樣本是一張20*20的灰度圖片fig, ax_array plt.subplots(nrows10, ncols10, figsize(6, 4))for row in range(10):fo…

Microsoft Expression Blend 2 密鑰,key

Microsoft Expression Blend 2 密鑰&#xff0c;key&#xff0c;序列TJ2R3-WHW22-B848T-B78YJ-HHJWJ號

ethereumjs/ethereumjs-common-3-test

查看test能夠讓你更好滴了解其API文檔的使用 ethereumjs-common/tests/chains.js const tape require(tape) const Common require(../index.js)tape([Common]: Initialization / Chain params, function (t) {t.test(Should initialize with chain provided, function (st) …

mysql修改_mysql修改表操作

一&#xff1a; 修改表信息1.修改表名alter table test_a rename to sys_app;2.修改表注釋alter table sys_application comment 系統信息表;二&#xff1a;修改字段信息1.修改字段類型和注釋alter table sys_application modify column app_name varchar(20) COMMENT 應用的名…

機器學習實踐四--正則化線性回歸 和 偏差vs方差

這次實踐的前半部分是&#xff0c;用水庫水位的變化&#xff0c;來預測大壩的出水量。 給數據集擬合一條直線&#xff0c;可能得到一個邏輯回歸擬合&#xff0c;但它并不能很好地擬合數據&#xff0c;這是高偏差&#xff08;high bias&#xff09;的情況&#xff0c;也稱為“欠…

深度學習 推理 訓練_使用關系推理的自我監督學習進行訓練而無需標記數據

深度學習 推理 訓練背景與挑戰&#x1f4cb; (Background and challenges &#x1f4cb;) In a modern deep learning algorithm, the dependence on manual annotation of unlabeled data is one of the major limitations. To train a good model, usually, we have to prepa…

Android strings.xml中定義字符串顯示空格

<string name"str">字 符 串</string> 其中 就表示空格。如果直接在里面鍵入空格&#xff0c;無論多少空格都只會顯示一個。 用的XML轉義字符記錄如下&#xff1a; 空格&#xff1a; <string name"out_bound_submit">出 庫</strin…

WCF開發入門的六個步驟

在這里我就用一個據于一個簡單的場景&#xff1a;服務端為客服端提供獲取客戶信息的一個接口讀取客戶信息&#xff0c;來完成WCF開發入門的六個步驟。 1. 定義WCF服務契約 A. 項目引用節點右鍵添加引用。 B. 在代碼文件里&#xff0c;添加以下命名空間的引…

LOJ116 有源匯有上下界最大流(上下界網絡流)

考慮有源匯上下界可行流&#xff1a;由匯向源連inf邊&#xff0c;那么變成無源匯圖&#xff0c;按上題做法跑出可行流。此時該inf邊的流量即為原圖中該可行流的流量。因為可以假裝把加上去的那些邊的流量放回原圖。 此時再從原來的源向原來的匯跑最大流。超源超匯相關的邊已經流…

CentOS 7 使用 ACL 設置文件權限

Linux 系統標準的 ugo/rwx 集合并不允許為不同的用戶配置不同的權限&#xff0c;所以 ACL 便被引入了進來&#xff0c;為的是為文件和目錄定義更加詳細的訪問權限&#xff0c;而不僅僅是這些特別指定的特定權限。 ACL 可以為每個用戶&#xff0c;每個組或不在文件所屬組中的用…

機器學習實踐五---支持向量機(SVM)

之前已經學到了很多監督學習算法&#xff0c; 今天的監督學習算法是支持向量機&#xff0c;與邏輯回歸和神經網絡算法相比&#xff0c;它在學習復雜的非線性方程時提供了一種更為清晰&#xff0c;更強大的方式。 Support Vector Machines SVM hypothesis Example Dataset 1…

作為微軟技術.net 3.5的三大核心技術之一的WCF雖然沒有WPF美麗的外觀

作為微軟技術.net 3.5的三大核心技術之一的WCF雖然沒有WPF美麗的外觀 但是它卻是我們開發分布式程序的利器 但是目前關于WCF方面的資料相當稀少 希望我的這一系列文章可以幫助大家盡快入門 下面先介紹一下我的開發環境吧 操作系統&#xff1a;windows vista business版本 編譯器…

服務器安裝mysql_阿里云服務器上安裝MySQL

關閉防火墻和selinuxCentOS7以下&#xff1a;service iptables stopsetenforce 0CentOS7.xsystemctl stop firewalldsystemctl disable firewalldsystemctl status firewalldvi /etc/selinux/config把SELINUXenforcing 改成 SELINUXdisabled一、安裝依賴庫yum -y install make …

在PyTorch中轉換數據

In continuation of my previous post ,we will keep on deep diving into basic fundamentals of PyTorch. In this post we will discuss about ways to transform data in PyTorch.延續我以前的 發布后 &#xff0c;我們將繼續深入研究PyTorch的基本原理。 在這篇文章中&a…

「網絡流24題」試題庫問題

傳送門&#xff1a;>Here< 題意&#xff1a;有K種類型的共N道試題用來出卷子&#xff0c;要求卷子須有M道試題。已知每道題屬于p種類型&#xff0c;每種類型的試題必須有且僅有k[i]道。現問出這套試卷的一種具體方案 思路分析 昨天打了一天的Dinic&#xff0c;今天又打了…

機器學習實踐六---K-means聚類算法 和 主成分分析(PCA)

在這次練習中將實現K-means 聚類算法并應用它壓縮圖片&#xff0c;第二部分&#xff0c;將使用主成分分析算法去找到一個臉部圖片的低維描述。 K-means Clustering Implementing K-means K-means算法是一種自動將相似的數據樣本聚在一起的方法,K-means背后的直觀是一個迭代過…

航海家軟件公式全破解

水手突破 上趨勢:MA(LOW,20)*1.2,color0080ff,linethick2;次上趨勢:MA(LOW,20)*1.1,COLORYELLOW;次下趨勢:MA(HIGH,20)*0.9,COLORWHITE;下趨勢:MA(HIGH,20)*0.8,COLORGREEN,linethick2;ZD:(C-REF(C,1))/REF(C,1)*100;HDZF:(HHV(H,20)-C)/(HHV(H,20)-LLV(L,20));趨勢強度:IF(C&g…