6.3.re庫的match物件
6.4.貪婪匹配和最小匹配
七 練習
一切為了資料探勘的準備
在中國大學mooc**上學習的北京理工大學嵩天老師的免費爬蟲課程課件,簡單易懂,感興趣的戳
嵩天老師爬蟲課程。侵刪
六 正規表示式
編譯:將符合正規表示式語法的字串轉化為正規表示式特徵,只有在compile之後才算正規表示式
6.1常用操作符
操作符說明
r可不是用反斜槓,表示原始字串
^匹配字串開頭
$匹配字串的末尾
.匹配任意字元,常用』.*』,表示匹配任意個任意字元
[…]用來表示匹配字元的範圍。常用』[a-z]』,或』[amk]』(amk中的任意乙個)
[^…]
匹配不在中的字元:[^abc]匹配除abc外的字元
*匹配0個或多個字元
+匹配1個或多個字元
?前乙個字元0次或1次擴充套件』abc?』,表示ab,abc
大括號前面的表示式重複n次
重複》= n次
重複n到m次
a|b匹配a或b
()匹配括號內的表示式,表示乙個組,內部只能使用
\w匹配字母、數字、下劃線[a-za-z0-9_]
\w匹配非字母、數字、下劃線
\d任意數字,等價於[0-9]
\d任意非數字
\a匹配從字串開始
\s匹配任意空白字元,等價於[\t\n\r\f]
\s匹配任意非空字元
舉例:
6.2正則表達的基本使用
import re
match = re.match(r'[1-9]\d', str)
if match: #判斷是否有匹配結果,否則會報錯
match.group(0)
6.2.1 表示型別
6.2.2 re庫主要功能函式
re.match(pattern, string, flags = 0),
從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功,返回none
re.findall(pattern, string, flags = 0),搜尋字串,以列表型別返回全部能匹配的字串
re.split(pattern, string[,maxsplit=0,flags=0]),
字串按照正規表示式的結果進行分隔,返回列表型別。
>>> re.split(r'[1-9]\d','bit100081 tsu100084')
['bit', ' tsu', '']
>>> re.split(r'[1-9]\d','bit100081 tsu100084',maxsplit=1)
['bit', ' tsu100084']
re.finditer(),找到所有的匹配物件,並作為迭代器返回,每次迭代都返回乙個match物件
re.finditer(pattern, string, flags=0)
例:
it = re.finditer(r"\d+","12a32bc43jf3")
for match in it:
print (match.group() )
6.2.3 re.compile
regrex = re.compile(pattern,flags)
6.3.re庫的match物件
match物件是一次匹配的結果,包含匹配的很多資訊
6.3.1 match物件的屬性:
6.3.2 物件的方法(用findall試試)
>>> line = "cats are smarter than dogs"
>>> m = re.match( r'(.*) are (.*?) .*', line, re.m|re.i)
>>> m.string
'cats are smarter than dogs'
>>> m.re
re.compile('(.*) are (.*?) .*', re.ignorecase|re.multiline)
>>> m.pos
0>>> m.endpos
26>>> m.group()
'cats are smarter than dogs'
>>> m.group(0)
'cats are smarter than dogs'
>>> m.group(1)
'cats'
>>> m.group(2)
'smarter'
>>> m.groups()
('cats', 'smarter')
>>> m.start()
0>>> m.end()
26>>> m.span()
(0, 26)
>>> m=re.search(r'[1-9]\d','bit100081 tsu100084')
>>> m.groups()
()>>> m.group()
'100081'
>>> m.group(0)
'100081'
6.4.貪婪匹配和最小匹配
預設貪婪匹配,匹配最長的字串
>>> m = re.match(r'py.*n','pyanbn***n')
>>> m.group(0)
'pyanbn***n'
當想要最小匹配時
>>> m = re.match(r'py.*?n','pyanbn***n')
>>> m.group(0)
'pyan'
七 練習
7.1.**商品爬取
目標:獲取**搜尋頁面的資訊,提取其中的商品名稱和**。需要找到**的搜尋介面,並且處理翻頁
7.1.1 思考
搜尋url:「" + 「商品類別」;翻頁url:「"+商品類別 +」&s=」 + 44*頁數
user-agent: *
disallow: /
當爬蟲類人行為,可以有限制的爬取
7.1.2**
import requests
import re
from bs4 import beautifulsoup
#提交請求
def gethtmltext(url):
try:
r = requests.get(url,timeout = 30)
r.raise_for_status()
return r.text
except:
print('wrong')
# 從頁面中提取資訊
def parsepage(ilt,html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html) #搜尋所有的**資訊
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html) #最小匹配,只取最後乙個",搜尋名稱資訊
for i in range(len(plt)):
price = eval(plt[i].split(':')[1]) #去掉最外層單雙引號
title = eval(tlt[i].split(':')[1])
except:
print(" ")
#列印資訊
def printgoodslist(ilt):
tplt = "\t\t"
print(tplt.format("序號","**","商品名稱"))
count = 0
for g in ilt:
count = count+1
print(tplt.format(count,g[0],g[1]))
def main():
#商品,爬取頁面的深度,url
goods = "書包"
depth = 2
start_url = 'q=' + goods
infolist =
#訪問每個頁面
for i in range(depth):
try:
url = start_url + '&s=' + str(44*i)
html = gethtmltext(url)
parsepage(infolist,html)
except:
continue
printgoodslist(infolist)
main()
1-9 ↩︎ Python爬蟲系列 51job爬蟲(二)
利用for迴圈爬取多頁資料並匯出到excel 匯入一些工具包 import requests from lxml import etree from pandas import dataframe import pandas as pd jobinfoall dataframe for i in r...
python爬蟲系列開發(二)scrapy安裝指南
scrapy在cpython 預設python實現 和pypy 從pypy 5.9開始 下執行python 2.7和python 3.4或更高版本。如果您使用的是anaconda或miniconda,您可以從conda forge通道安裝該軟體包,該軟體包含適用於linux,windows和os x...
小爬蟲系列
玩玩小爬蟲 抓取時的幾個小細節 摘要 這一篇我們聊聊在頁面抓取時應該注意到的幾個問題。一 網頁更新 我們知道,一般網頁中的資訊是不斷翻新的,這也要求我們定期的去抓這些新資訊,但是這個 定期 該怎麼理解,也就是多長時間需要抓一次該頁面,其實這個定期也就是頁面快取時間,在頁面的快取時間內我們再次抓取該網...