前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
以下文章來源于爬取你的深度神經網路,作者阿浩
轉載地址
https://blog.csdn.net/fei347795790?t=1
今天給大家展示Python中正則運算式在爬蟲中的應用,并用xlwt模塊存入到excel中,掌握這個技能后,就能從一些簡單的網站爬取想要的資料資訊并存入到自己的資料庫中了,
正則運算式基礎語法
1.普通字符:
字母、數字、漢字、下劃線、以及沒有特殊定義的標點符號,都是“普通字符”,運算式中的普通字符,在匹配一個字串的時候,匹配與之相同的一個字符,
2.簡單的轉義字符:
3.標準字符集合:
能夠與'多種字符' 匹配的運算式
注意區分大小寫,大寫是相反的意思
4.自定義字符集合:
[ ]方括號匹配方式,能夠匹配方括號中任意一個字符
例如:[2-8a-n] 匹配2至8的數和a至n的數
注意:
正則運算式的特殊符號,被包含到中括號中,則失去特殊意義,除了^,-之外
標準字符集合,除小數點外,如果被包含于中括號,自定義字符集合將包含該集合,
比如:[\d.\-+]將匹配:數字(\d)、小數點(.)、+(\+)、-(\-)
5.量詞:
修飾匹配次數的特殊符號
例:\d{6} 匹配6個數字的
\d{0,1} 匹配0個數字或者1個數字
注意:
- 匹配次數中的貪婪模式(匹配字符越多越好,默認!)
- 匹配次數中的非貪婪模式(匹配字符越少越好,修飾匹配次數的特殊符號后再加上一個"?"號)
例:
\d{3,6} 匹配3-6個數字的(默認:貪婪式)
\d{3,6}?匹配3-6個數字(非貪婪模式)
6.字符邊界
標記匹配的不是字符而是位置,符合某種條件的位置
注:\b匹配這樣一個位置:前面的字符和后面的字符不全是\w
7.選擇符和分組(常常與8聯用)
8.反向參考(\nnn)
每一對()會分配一個編號,使用()的捕獲根據左括號的順序從1開始自動編號,
通過反向參考,可以對分組已捕獲的字串進行參考,
注意:根據左括號為準編號!
例:goto gogo toto dodo todo 只想匹配gogo toto dodo---->([a-z]{2})\1 : 匹配(a-z){2}后再匹配1次
9.預搜索
例:[a-z]+(?=ing) 表示:匹配字母開頭,ing結尾的字符(不包括ing)
下面以豆瓣的出版社提供方網站(https://read.douban.com/provider/all)為例進行爬取,爬取所有的出版社網址、出版社名稱、出版社logo網址以及在售作品數量,
首先匯入需要的模塊
from urllib.request import urlopen, Request import re,xlwt,datetime
然后抓取網頁源代碼內容,這里網站設定了反爬蟲機制,因此要模擬瀏覽器訪問,直接爬取會被攔截,這里設定了請求頭為瀏覽器訪問模式,
url="https://read.douban.com/provider/all" headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}ret = Request(url, headers=headers)html=urlopen(ret).read() #讀取網頁源代碼內容wzgz="<a href=https://www.cnblogs.com/"/provider/(.*?)\" class=\"provider-item\"><div class=\"col-media\"><div class=\"cm-left avatar\"><div class=\"avatar\"><img src=https://www.cnblogs.com/"(.*?)\"/></div></div><div class=\"cm-body\"><div class=\"name\">(.*?)</div><div class=\"works-num\">(.*?) 部作品在售</div></div></div></a>" xx=re.compile(wzgz).findall(str(html,"utf-8")) #通過正則運算式匹配在網頁源代碼中提取所需內容print(xx)
得到如下結果,這是一個包含了每個出版社資訊的串列,每個串列元素是一個元組,元組包含了出版社網址引數、出版社名稱、出版社logo網址以及在售作品數量等資訊:
接下來利用xlwt模塊將爬取到的資訊存入到excel中,
#創建workbook和sheet物件 workbook = xlwt.Workbook()sheet1 = workbook.add_sheet('sheet1',cell_overwrite_ok=True) #初始化excel樣式style = xlwt.XFStyle()#為樣式創建字體font = xlwt.Font()font.name = 'Times New Roman' #字體樣式 font.bold = True #字體粗細#設定樣式的字體style.font = font#在sheet1表的第1行設定欄位名稱并寫入資料 sheet1.write(0,0,"序號",style) sheet1.write(0,1,"出版社-URL",style) sheet1.write(0,2,"LOGO-URL",style) sheet1.write(0,3,"出版社名稱",style) sheet1.write(0,4,"在售作品數量",style)
利用for回圈將前述爬取的資訊存入到設定好的excel中
a=0 #定義行號初始值 h=0 #定義在售數量初始值 for i in xx: #print(str(a+1),i[0]) sheet1.write(a+1,0,a+1,style) #在第a+1行第1列寫入序號 sheet1.write(a+1,1,"https://read.douban.com/provider/"+str(i[0]),style) #在第a+1行第2列寫入出版社URL sheet1.write(a+1,2,i[1],style) #在第a+1行第3列寫入LOGO-URL sheet1.write(a+1,3,i[2],style) #在第a+1行第4列寫入出版社名稱 sheet1.write(a+1,4,int(i[3]),style) #在第a+1行第5列寫入在售數量 h+=int(i[3]) #在售數量累計求和 a+=1 if a==a: #判斷XX串列是否遍歷結束,并在sheet1表尾行寫入在售數量求和的值 t=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") t1=datetime.datetime.now().strftime("%Y%m%d%H%M%S") sheet1.write(a+1,3,"合計",style) #在sheet1表尾行寫入“合計” sheet1.write(a+1,4,h,style) #在sheet1表尾行寫入在售數量累計值 sheet1.write(a+2,3,"采集時間",style) #在sheet1表尾行寫入資料采集時間 sheet1.write(a+2,4,t,style) #在sheet1表尾行寫入資料采集時間 workbook.save("D:/python study/week2/"+str(t1)+".xls") #保存該excel檔案,有同名檔案時無法直接覆寫 print("資料寫入excel檔案完畢!") print("在售書數量合計:"+str(h))
程式運行結果:
最終得到的Excel檔案:
到這里就大功告成啦,快把你的資料用起來吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/119921.html
標籤:Python
上一篇:基于 Python 的 tkinter 模塊制作的名人名言查詢工具
下一篇:陣列作為函式引數問題!!!
