python爬虫资源大全_Python爬虫抓取纯静态网站及其资源(基础篇)
本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理
以下文章來源于騰訊云 作者:程序員寶庫
**( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群文件流,可以自行下載!還有海量最新2020python學習資料。 )**
遇到的需求
前段時間需要快速做個靜態展示頁面,要求是響應式和較美觀。由于時間較短,自己動手寫的話也有點麻煩,所以就打算上網找現成的。
中途找到了幾個頁面發現不錯,然后就開始思考怎么把頁面給下載下來。
由于之前還沒有了解過爬蟲,自然也就沒有想到可以用爬蟲來抓取網頁內容。所以我采取的辦法是:
打開chrome的控制臺,進入Application選項
找到Frames選項,找到html文件,再右鍵Save As…
手動創建本地的js/css/images目錄
依次打開Frames選項下的Images/Scripts/Stylesheets,一個文件就要右鍵Save As…
這個辦法是我當時能想到的最好辦法了。不過這種人為的辦法有以下缺點:
手工操作,麻煩費時
一不小心就忘記保存哪個文件
難以處理路徑之間的關系,比如一張圖片a.jpg, 它在html中的引用方式是images/banner/a.jpg,這樣我們以后還要手動去解決路徑依賴關系然后剛好前段時間接觸了一點python,想到可以寫個python爬蟲來幫我自動抓取靜態網站。于是就馬上動手,參考相關資料等等。
下面跟大家詳細分享一下寫爬蟲抓取靜態網站的全過程。
前置知識儲備
在下面的代碼實踐中,用到了python知識、正則表達式等等,核心技術是正則表達式。
我們來一一了解一下。
Python基礎知識
如果你之前有過其他語言的學習經歷,相信你可以很快上手python這門語言。具體學習可以上查看python官方文檔或者其他教程。
爬蟲的概念
爬蟲,按照我的理解,其實是一段自動執行的計算機程序,在web領域中,它存在的前提是模擬用戶在瀏覽器中的行為。
它的原理就是模擬用戶訪問web網頁,獲取網頁內容,然后分析網頁內容,找出我們感興趣的部分,并且最后處理數據。
流程圖是:
現在流行的爬蟲主流實現形式有以下幾種:
1.自己抓取網頁內容,然后自己實現分析過程
2.用別人寫好的爬蟲框架,比如Scrapy
正則表達式
概念
正則表達式是由一系列元字符和普通字符組成的字符串,它的作用是根據一定的規則來匹配文本,最終可以對文本做出一系列的處理。
元字符是正則表達式中的保留字符,它有特殊的匹配規則,比如*代表匹配0到無窮多次,普通字符就是普通的abcd等等。
比如在前端中,常見的一個操作就是判斷用戶的輸入是否為空,這時候我們可以先通過正則表達式來進行匹配,先過濾掉用戶輸入的兩邊空白值,具體實現如下:
function trim(value) {return value.replace(/^s+|s+$/g, '')
}// 輸出 => "Python爬蟲"trim('Python爬蟲');
下面我們一起來具體了解一下正則表達式中的元字符。
正則表達式中的元字符
在上面,我們說過元字符是正則表達式中的保留字符,它有特殊的匹配規則,所以我們首先要了解經常出現的元字符。
匹配單個字符的元字符
代表匹配一個任意字符,除了(換行符),比如可以匹配任意的字母數字等等
[…]表示字符組,里面可以有任意字符,它只會匹配當中的任意一個,比如[abc]可以匹配a或b或c,這里值得注意的是,字符組里面的元字符有時候會被當成是普通字符,比如[-?]等等,它代表的僅僅是-或或?,而不是-代表區間,*代表0到無窮次匹配,?代表0或1次匹配。
[^…]跟[…]的含義相反,它的意思是匹配一個不屬于[…]里面的字符,而不是不匹配[…]里面的字符,這兩種說法雖然細微但是有很大差別,前者規定一定要匹配一個字符,這個切記。
例子:[^123]可以匹配4/5/6等等,但是不匹配1/2/3
提供計數功能的元字符
*代表匹配0次到無窮次,可以不匹配任何字符
+代表匹配1次到無窮次,至少匹配1次
?代表匹配0次或1次
{min, max}代表匹配min次到max次,如a{3, 5}表示a至少匹配3-5次
提供位置的元字符
^ 代表匹配字符串開頭,如^a表示a要出現在字符串開頭,bcd則不匹配
$ 代表匹配字符串結尾, 如A$表示A要出現在字符串結尾,ABAB則不匹配
其他元字符
|代表一個范圍,可以匹配任意的子表達式,比如abc|def可以匹配abc或者def,不匹配abd
(…)代表分組,它的作用有界定子表達式的范圍和與提供功能的元字符相結合,比如(abc|def)+代表可以匹配1次或1次以上的abc或者defdef,如abcabcabc,def
i代表反向引用,i可以為1/2/3等整數,它的含義是指向上一個()里面匹配的內容。比如匹配(abc)+(12)*,如果匹配成功的話,的內容是abc,的內容是12或者空。反向引用通常用在匹配""或者’'中
環視
我理解的環視是界定當前匹配子表達式的左邊文本和右邊文本出現的情況,環視本身不會占據匹配的字符,它是當前子表達式的匹配規則但是本身不算進匹配文本。而我們上面說的元字符都代表一定的規則和占據一定的字符。
環視可分為四種:肯定順序環視、否定順序環視、肯定逆序環視和否定逆序環視。它們的工作流程如下:
肯定順序環視:先找到環視中的文本在右側出現的初始位置,然后從匹配到的右側文本的最左的位置開始匹配字符
否定順序環視:先找到環視中的文本在右側沒有出現的初始位置,然后從匹配到的右側文本的最左的位置開始匹配字符
肯定逆序環視:先找到環視中的文本在左側出現的初始位置,然后從匹配到的左側文本的最右的位置開始匹配字符
否定逆序環視:先找到環視中的文本在左側沒有出現的初始位置,然后從匹配到的左側文本的最右的位置開始匹配字符
肯定順序環視
肯定順序環視匹配成功的條件是當前的子表達式能夠匹配右側文本,它的寫法是(?=…),…代表要環視的內容。比如正則表達式(?=hello)he的意思是匹配包含hello的文本,它只匹配位置,不匹配具體字符,匹配到位置之后,才真正匹配要占用的字符是he,所以后面可以具體匹配llo等。
對于(?=hello)he而言,hello world可以匹配成功,而hell world則匹配失敗。具體代碼如下:
importre
reg1= r'(?=hello)he'
print(re.search(reg1, 'hello world'))print(re.search(reg1, 'hell world hello'))print(re.search(reg1, 'hell world'))#輸出結果
<_sre.sre_match object span="(11," match="he">None
否定順序環視
否定順序環視匹配成功的條件是當前的子表達式不能匹配右側文本,它的寫法是(?!..),…代表要環視的內容,還是上面的例子,比如正則表達式(?!hello)he的意思是匹配不是hello的文本,找到位置,然后匹配he。
例子如下:
importre
reg2= r'(?!hello)he'
print(re.search(reg2, 'hello world'))print(re.search(reg2, 'hell world hello'))print(re.search(reg2, 'hell world'))#輸出結果
None<_sre.sre_match object span="(0," match="he">
肯定逆序環視
肯定逆序環視匹配成功的條件是當前的子表達式能夠匹配左側文本,它的寫法是(?<=…),…代表要環視的內容,比如正則表達式(?<=hello)-python的意思是匹配包含-python的子表達式,并且它的左側必須出現hello,hello只匹配位置,不匹配具體字符,真正占用的字符是后面的-python。
例子如下:
importre
reg3= r'(?<=hello)-python'
print(re.search(reg3, 'hello-python'))print(re.search(reg3, 'hell-python hello-python'))print(re.search(reg3, 'hell-python'))#輸出結果
<_sre.sre_match object span="(17," match="-python">None
否定逆序環視
否定逆序環視匹配成功的條件是當前的子表達式不能匹配左側文本,它的寫法是(?
例子如下:
importre
reg3= r'(?<=hello)-python'
print(re.search(reg3, 'hello-python'))print(re.search(reg3, 'hell-python hello-python'))print(re.search(reg3, 'hell-python'))#輸出結果
環視在對字符串插入某些字符很有效,你可以利用它來匹配位置,然后插入對應的字符,而不需要對原來的文本進行替換。
捕獲分組
在正則表達式中,分組可以幫助我們提取出想要的特定信息。
指明分組很簡單,只需要在想捕獲的表達式中兩端加上()就可以了。在python中,我們可以用re.search(reg, xx).groups()來獲取到所有的分組。
默認的()中都指明了一個分組,分組序號為i,i從1開始,分別用re.search(reg, xx).group(i)來獲取。
如果不想捕獲分組可以使用(?:…)來指明。
具體例子如下:
importre
reg7= r'hello,([a-zA-Z0-9]+)'
print(re.search(reg7, 'hello,world').groups())print(re.search(reg7, 'hello,world').group(1))print(re.search(reg7, 'hello,python').groups())print(re.search(reg7, 'hello,python').group(1))#輸出結果
('world',)
world
('python',)
python
貪婪匹配
貪婪匹配是指正則表達式盡可能匹配多的字符,也就是趨于最大長度匹配。
正則表達式默認是貪婪模式。
例子如下:
importre
reg5= r'hello.*world'
print(re.search(reg5, 'hello world,hello python,hello world,hello javascript'))#輸出結果
由上可以看到它匹配的是hello world,hello python,hello world而不是剛開始的hello world。那如果我們只是想匹配剛開始的hello world,這時候我們可以利用正則表達式的非貪婪模式。
非貪婪匹配正好與貪婪匹配相反,它是指盡可能匹配少的字符,只要匹配到了就結束。要使用貪婪模式,僅需要在量詞后面加上一個問號(?)就可以。
還是剛剛那個例子:
importre
reg5= r'hello.*world'reg6= r'hello.*?world'
print(re.search(reg5, 'hello world,hello python,hello world,hello javascript'))print(re.search(reg6, 'hello world,hello python,hello world,hello javascript'))#輸出結果
由上可以看到這是我們剛剛想要匹配的效果。
總結
以上是生活随笔為你收集整理的python爬虫资源大全_Python爬虫抓取纯静态网站及其资源(基础篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓模拟器运行python_利用pyth
- 下一篇: python需要安装的库_使用pytho