#python網絡爬蟲
#通用網絡爬蟲(沒有目的,爬去所有的URL) 聚焦網絡爬蟲(過濾無關的連結)
#python資料分析與挖掘實戰的正規表達式
#正規表達式 世界上資訊非常多,而我們關注的資訊有限。假如我們希望隻提取出關注資料,此時可以通過一些表達式進行提取,正規表達式就是其中一種進行資料篩選的表達式。
#原子
#原子是正規表達式中最基本的組成機關,每個正規表達式中至少要包含一個原子。
#常見的原子類型有:普通字元作為原子,非列印字元作為原子,通用字元作為原子,原子表
import re
pat="yue" #普通字元作為原子
string="http://yum.iqianyue.com"
rst=re.search(pat,string)
print(rst)
pat1="\n" #\n \t #非列印字元作為原子
string1='''dsfjsdjf
sdfsdfsdfsdf'''
rst1=re.search(pat1,string1)
print(rst1)
pat2="\w\dpython\w"
#\w 通用字元,比對任意字母,數字,下劃線
#\d 比對任意一個十進制數 #\S 除了十進制數的任意
#|s 比對空白字元 #\S 除了空白字元的任意字元
#\W 比對任意一個除了字母,數字,下劃線的東西
string2="hsdlfsga7pythonkdfshdskjf"
rst2=re.search(pat2,string2)
print(rst2)
pat3="pyth[jsz]n" #原子表 定義一組平等的字元
string3="fsdjfpythjnjslkdfpythsnjfsjpythjsnfsd"
rst3=re.search(pat3,string3)
print(rst3)
#元字元
#正規表達式中具有一些特殊含義的字元,比如重複N次前面的字元等
#. 比對任意字元
#^ 比對字元串中的開始位置
#$ 比對字元串中結束的位置
#* 比對0次 1次或者多次的前面的原子
#?比對0次或者1次前面的原子
#+ 比對一次或多次前面的原子
#{3} 前面的原子恰好出現了3次 并且連在一起的
#{n} 出現了n次
#{4,7} 至少出現4次 之多出現7次 {4,}
#t|s 出現t或者s
#() 提取某一個内容
pat4=".python..."
string4="sjslkdjfpythonslfjshf"
rst4=re.search(pat4,string4)
print(rst4)
pat5="python|php"
string5="jfsdjphpjsljfspythonfsd"
rst5=re.search(pat5,string5)
print(rst5)
#模式修正符
#可以在不改變正規表達式的情況下,通過模式修正符改變正規表達式的含義,進而實作一些比對結果的調整等功能
#I 使正規表達式不區分大小寫
#M 多行比對
#L 本地化識别比對
#U 根據Unicode解析字元
#S 讓點也能比對包括換行符
pat6="python"
pat7="python"
string6="sjljfaljafPythonsfjlsjfssfs"
rst6=re.search(pat6,string6)
print(rst6)
rst7=re.search(pat7,string6,re.I) #模式修正符執行個體,不區分大小寫
print(rst7)
#貪婪模式和懶惰模式
#貪婪模式盡可能的多的去比對 #懶惰模式盡可能少的去比對
pat8="p.*y" #貪婪模式 更多的去覆寫
pat9="p.*?y" #懶惰模式 更精準的定位
string8="jlsjfhspythonslfjshdpy"
rst8=re.search(pat8,string8)
rst9=re.search(pat9,string8)
print(rst8)
print(rst9)
#正規表達式函數
#正規表達式函數有re.match()函數,re.search()函數,全局比對函數,re.sub()函數
#re.search() 從字元串中搜尋出來
#re.match() 從頭開始比對,如果一開始沒有,那麼就傳回None
#全局比對函數
#re.sub() 主要用于替換
string10="phskfhskjhfkjshfjksgjfyskjhfksdh"
rst10=re.match(pat8,string10)
print(rst10)
rst11=re.compile(pat8).findall(string10) #全局搜尋函數 顯示所有滿足條件的 後面用的最多
print(rst11)
#常見正規表達式執行個體
#比對.com .cn網址
pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
string='<a href="http://www.baidu.com">fjsljflds</a>'
rst=re.compile(pat).findall(string)
print(rst)
#簡單的爬蟲,如何爬取csdn某個課程頁面上的QQ群
pat="<p>(\d*?)</p>"
import urllib.request
data=urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/215").read()
rst=re.compile(pat).findall(str(data))
print(rst)
#作業:如何爬取豆瓣出版社清單并寫入檔案中
#豆瓣網址:https://read.douban.com/provider/all
import urllib.request
import re
data=urllib.request.urlopen("https://read.douban.com/provider/all").read()
data=data.decode("utf-8")
pat='<div class="name">(.*?)</div>'
mydata=re.compile(pat).findall(data)
print(mydata)
fh=open("/Users/xubin/myapp/pythonfile/出版社file4.txt","w")
for i in range(0,len(mydata)):
fh.write(mydata[i]+"\n")
fh.close()