零基础学习爬虫并实战
總第63篇
本篇主要從爬蟲是什么、爬蟲的一般流程、爬蟲各個流程的實現方法、爬蟲實例四個方面分享零基礎了解爬蟲,并進行簡單的實戰。
在閱讀下面之前,我們需要對網頁有個基本的了解,知道什么是標簽,什么是屬性,以及知道標題是放在哪,內容是放在哪,這些關于網站的基礎知識。
可查看我前幾篇關于網頁基礎知識的推文:
網頁是怎么構成的?
網頁的修飾
網頁的行為
01|爬蟲是什么:
爬蟲又叫網頁數據抓取,就是通過向瀏覽器發出請求并得到回應,把回應的內容抓取保存到本地的過程叫做爬蟲。
比如,我要獲取貓眼電影的TOP100榜電影的信息,其中包括電影名、主演、上映時間、評分以及封面圖片。我們可以選擇手動一條條登記,也可以寫一個爬蟲(通過瀏覽器向貓眼電影發出一個request然后得到一個response)去獲取這些信息。
02|爬蟲一般流程:
1、發起請求,通過HTTP庫向目標站點發起請求,即發送一個Request。一般會包括下面這些部分。
2、獲取響應內容,如果服務器能夠正常響應,會得到一個Response,Response的內容便是要獲取的頁面內容,類型可能有HTML,Json字符串,二進制數據(圖片視頻等一般為二進制數據)等類型。
3、解析內容,得到的內容如果是HTML,可以用正則表達式和網頁解析庫進行解析;如果是Json,直接轉為Json對象解析;如果是二進制數據,可以保存也可以做進一步處理。
json.dumps():對json數據進行編碼。(Python編碼為json類型)
json.loads():對json數據進行解碼。(json解碼為Python類型)
4、保存數據,保存形式有多種,可以存為文本,也可以保存至數據庫,或者保存到特定格式的文件。
03|實現上述爬蟲過程的具體方法:
1、獲取內容
這里的獲取內容包括前面提到的request和response兩個過程。
Urllib庫
直接將目標網站鏈接url傳遞給urlopen函數即可。
import urllib.request response = urllib.request.urlopen('http://www.baidu.com') print(response)#打印出得到回應的一行代碼 print(response.read())#打印出獲得的html內容 print(response.read().decode("utf-8"))#以“utf-8”編碼的格式打印出獲得的html內容關于decode和encode的一些科普
字符串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
decode的作用是將其他編碼的字符串轉換成unicode編碼,如str1.decode(‘gb2312’),表示將gb2312編碼的字符串str1轉換成unicode編碼。
encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2.encode(‘gb2312’),表示將unicode編碼的字符串str2轉換成gb2312編碼。
因此,轉碼的時候一定要先搞明白,字符串str是什么編碼,然后decode成unicode,然后再encode成其他編碼。
request庫
將目標網站鏈接url傳遞給request.get函數即可。
import requests response = requests.get('http://httpbin.org/get') response = requests.get("http://httpbin.org/get?name=germey&age=22")#帶有參數的url print(response.text)#獲取response的具體html內容2、解析內容
所謂的解析內容就是用一定的方法從獲得的全部內容中取出我們想要的某一部分內容,開頭講述的貓眼電影top100的獲取,我們通過第一步獲取內容取得是整個網頁的所有部分,但我們只需要這所有部分中的標題、主演、評分等信息。
正則表達式
正則表達式是用一些符號去表示要匹配的內容,然后將其放在過程1中獲得的全部內容中區匹配我們想要的內容。
| \w | 匹配字母數字及下劃線 |
| \W | 匹配非字母數字下劃線 |
| \s | 匹配任意空白字符,等價于 [\t\n\r\f]. |
| \S | 匹配任意非空字符 |
| \d | 匹配任意數字,等價于 [0-9] |
| \D | 匹配任意非數字 |
| \A | 匹配字符串開始 |
| \Z | 匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串 |
| \z | 匹配字符串結束 |
| \G | 匹配最后匹配完成的位置 |
| \n | 匹配一個換行符 |
| \t | 匹配一個制表符 |
| ^ | 匹配字符串的開頭 |
| $ | 匹配字符串的末尾。 |
| . | 匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。 |
| […] | 用來表示一組字符,單獨列出:[amk] 匹配 ‘a’,’m’或’k’ |
| [^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
| * | 匹配0個或多個的表達式。 |
| + | 匹配1個或多個的表達式。 |
| ? | 匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式 |
| {n} | 精確匹配n個前面表達式。 |
| {n, m} | 匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式 |
| a|b | 匹配a或b |
| ( ) | 匹配括號內的表達式,也表示一個組 |
上面的表是直接copy的崔慶才老師的表,老師在天善智能有開設爬蟲入門課程,課程鏈接:https://edu.hellobi.com/course/157/lessons
在正則表達式中我們常用的是re.findall(pattern,html,re.S),三個參數依次表示目標匹配內容(正則表達式書寫的)、待匹配的全部內容(過程1獲得的全部內容)、匹配模式。在后面的實例中我們就是用的正則表達式進行解析的,具體內容看后面的實例。
BeautifualSoup
BeautifulSoup是python自帶的一個庫,在這個庫中我們常用下面這個選擇器:
find_all( name , attrs , recursive , text , **kwargs )
參數依次要查找的標簽名、屬性和內容。該選擇器輸出內容為所有符合條件的項。
from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml')#html表示要待解析的內容,lxml表示解析方式print(soup.find_all('ul'))#表示輸出所有標簽名為“ul”的內容 print(type(soup.find_all('ul')[0]))##表示輸出第一個標簽名為“ul”的內容 print(soup.find_all(attrs={'id': 'list-1'}))#表示輸出屬性id=list對應的值 print(soup.find_all(text='Jay'))#獲取標簽內的內容為“Jay”的項3、保存內容到本地
先使用open創建并打開一個file對象,然后使用write方法將內容寫入到這個file對象中。
04|爬取貓眼電影實例:
獲取內容
import requests response = requests.get("http://maoyan.com/board/4") print (response.text)解析內容
import re#導入re庫pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S) items = re.findall(pattern, response.text)
(部分解析結果)
保存到本地
import jsonwith open('result.txt', 'a', encoding='utf-8') as f:#open用于打開一個文件,并創建一個file對象f.write(json.dumps(items, ensure_ascii=False) + '\n')#write()方法的參數為字符串形式,所以需要用json_dumps將字典形式轉化為字符串f.close()這樣一個包含有電影信息的名為result.txt文件就保存到本地了。整個爬蟲過程就完成了。
總結
以上是生活随笔為你收集整理的零基础学习爬虫并实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 韩国签证所需材料有哪些 韩国签证所需资料
- 下一篇: 证书边框花纹如何制作