兩種典型爬蟲:通用網絡爬蟲、聚焦網絡爬蟲
通用網絡爬蟲實現原理與過程:
- 獲取初始的URL
- 根據初始的URL爬取頁面并獲取新的URL
- 將新的URL放到URL隊列中
- 從URL隊列中讀取新的URL,并根據新的URL爬取網頁饼齿,同時從新網頁中獲取新的URL何缓,并重復上述爬取過程
- 滿足爬蟲系統(tǒng)設置的停止條件時庸论,停止爬取
聚焦網絡爬蟲(有目的地進行爬日潞怼)實現原理與過程:
定義和描述要爬取的目標
獲取初始的URL
根據初始的URL爬取頁面并獲取新的URL
從新的URL中過濾掉與爬取目標無關的鏈接梅肤,同時將已爬取的URL地址存放到一個URL列表中,用于去重和判斷爬取的進程
將過濾后的鏈接放到URL隊列中從URL隊列中沐序,根據搜索算法琉用,確定URL的優(yōu)先級堕绩,并確定下一步要爬取的URL地址
從下一步要爬取的URL地址中,讀取新的URL邑时,然后依據新的URL地址爬取網頁奴紧,并重復上述爬取過程
-
滿足系統(tǒng)中設置的停止條件,或無法獲取新的URL地址時刁愿,停止爬行
爬行策略主要有深度優(yōu)先绰寞、廣度優(yōu)先到逊、最佳優(yōu)先等爬行策略铣口。
身份識別
一般的,爬蟲對網頁進行爬取的時候觉壶,會通過HTTP請求中的User Agent字段告知自己的身份信息脑题。一般爬蟲訪問一個網站的時候,首先會根據該站點下的Robots.txt文件來確定可以爬取的網頁范圍铜靶,Robots協(xié)議是需要網絡爬蟲共同遵守的協(xié)議叔遂,對于一些禁止的URL地址,網絡爬蟲則不應該爬取訪問争剿。
爬蟲方法
本篇筆記主要記錄利用python爬取數據時最常用的兩個方法庫:Requests庫和Scrapy庫已艰。
Requests
#常用的模版:
import requests
url = ''
def geturl(url):
try:
r = requests.get(url,timeout = 10)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])//return r.text[:1000]
except:
print('error')
Requests主要方法
# 常用命令:
requests.get()
requests.head() #當網頁比較大的時候,先獲取它的頭部信息
# 一般用法:
requests.get/head('網址',**kwargs)
kv = 字典
params = kv #用于網址蚕苇?后面添加內容
headers = kv #用于改變爬蟲的user-agent
timeout = 10
Requests屬性
r.content #用于當要以二進制形式存儲的時候
Re庫的基本使用
import re #主要用于字符串匹配
re庫主要使用raw string類型(原生字符串類型)
如:r'[1-9],{5}'
原生字符串即不包含轉義符的字符串.
Re庫主要功能函數
函數 | 說明 |
---|---|
re.seach() | 在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象. |
re.match() | 從一個字符串的開始位置起匹配正則表達式,返回match對象. |
re.findall() | 搜索字符串,以列表類型返回全部能匹配的字符串. |
re.split() | 將一個字符串按照正則表達式結果進行分割,返回列表類型. |
re.finditer() | 搜索字符串,返回一個匹配結果的迭代類型,每一個迭代元素是match對象. |
re.sub() | 在一個字符串中替換所有匹配正則表達式的子串,返回替換后的字符串. |
re.search(pattern,string,flags=0)
- pattern:正則表達式的字符串或原生字符串表示
- string:待匹配字符串
- flags:正則表達式使用的控制標記
常用標記 | 說明 |
---|---|
re.I re.IGNORECASE | 忽略正則表達式的大小寫,[A-Z]能夠匹配小寫字符 |
re.M re.MULTILINE | 正則表達式中的^操作符能夠將給定字符串的每行當作匹配開始 |
re.S re.DOTALL | 正則表達式中的.操作符能夠匹配所有字符,默認匹配所有除換行符外的所有字符 |
import re
match=re.search(r'[1-9]\d{5}','BIT100081')
if match:
print(match.group(0))
#輸出 100081
type(match)#輸出 _sre.SRE_Match
match就是一次匹配的結果.
match對象的屬性 | 說明 |
---|---|
.string | 待匹配的文本 |
.re | 匹配時使用的pattern對象(正則表達式) |
.pos | 正則表達式搜索文本的開始位置 |
.endpos | 正則表達式搜索文本的將結束為止 |
match對象的方法 | 說明 |
---|---|
.group(0) | 獲得匹配后的字符串 |
.start() | 匹配字符串在原始字符串的開始位置 |
.end() | 匹配字符串在原始字符串的結束為止 |
.span() | 返回(.start(),.end()) |
Re庫默認采用貪婪匹配,即輸出匹配最長的子串.
match=re.search(r'PY.*N','PYANBNCNDN')
match.group(0)
#貪婪匹配哩掺,輸出PYANBNCNDN
match=re.search(r'PY.*?N','PYANBNCNDN')#加?號后,為最小匹配涩笤,輸出PYAN
match.group(0)
最小匹配操作符 | 使用說明 |
---|---|
*? | 前一個字符0次或無限次擴展,最小匹配 |
+? | 前一個字符1次或無限次擴展,最小匹配 |
?? | 前一個字符0次或1次擴展,最小匹配 |
{m,n}? | 擴展前一個字符m至n次(含n),最小匹配 |
事實上,操作符后加"?",就可以獲得匹配結果.
Scrapy
常用命令
scrapy startproject name cd name scrapy genspider sname #創(chuàng)建工程嚼吞,spider模版
編寫spider里的.py內容 #進行內容爬取和信息處理 #def parse就是對get到的Response進行處理
編寫pipelines.py文件 #對所得到的信息做進一步處理
修改setting.py #對爬蟲的性能做進一步優(yōu)化
-
scrapy crawl name #運行爬蟲
?
爬蟲中的注意點
對于url網址,不必在意里面一些復雜的內容蹬碧,可以直接忽略舱禽,找?guī)讉€網址的共同點
獲取到html信息后,可以用beautifulsoup進行形式解析處理恩沽;也可以直接進行搜索+re
eval()#可以去引號
url里必須都是字符串形式
-
正則表達式中“兩者選其一并且可無限擴充”用
[abc]*
不要拘泥于一個信息源(一個網站)誊稚,選擇最合適爬蟲的網站
只要是在爬取時、循環(huán)時一定要異常處理罗心!
如果返回值是列表里伯,而且只有一個元素或者有了特定要選取的元素⌒牛可以直接在后面添加[0]