爬蟲系列二

2021-09-17 08:24:50 字數 4391 閱讀 6434

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...

小爬蟲系列

玩玩小爬蟲 抓取時的幾個小細節 摘要 這一篇我們聊聊在頁面抓取時應該注意到的幾個問題。一 網頁更新 我們知道,一般網頁中的資訊是不斷翻新的,這也要求我們定期的去抓這些新資訊,但是這個 定期 該怎麼理解,也就是多長時間需要抓一次該頁面,其實這個定期也就是頁面快取時間,在頁面的快取時間內我們再次抓取該網...