我們首先來看下執行個體代碼:
import urllib
import urllib.request
import re
from urllib import parse
#抓取貼吧頁面數量資訊
def gettiebalistnumbers(name): #計算搜尋的關鍵詞有多少頁 輸入名字 傳回頁數
url="https://tieba.baidu.com/f?"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE"} # header 字典形式
word = {"kw": name} # 接口 貼吧的名字
word = parse.urlencode(word) # 編碼成字元串
url = url + word # 拼接url
request = urllib.request.Request(url, headers=headers) # 發送請求
# 也可以通過調用Request.add_header() 添加/修改一個特定的 header
request.add_header("Connection", "keep-alive") # 一直活着
response = urllib.request.urlopen(request) # 打開請求
data = response.read().decode("utf-8") # 讀取資料
print(response.code) # 可以檢視相應狀态碼
restr = "<span class=\"card_infoNum\" ([\s\S]*?)</span " # 正則這個貼吧有多少文章
regex = re.compile(restr, re.IGNORECASE)
mylist = regex.findall(data) #尋找頁面所有符合條件的
tienumbers = mylist[0].replace(",","") #替換逗号
tienumbers = eval(tienumbers) #str轉化為數字
#print(tienumbers)
restr = "<span class=\"card_menNum\" ([\s\S]*?)</span " # 正則關注貼吧的數
regex = re.compile(restr, re.IGNORECASE)
mylist = regex.findall(data) # 尋找頁面所有符合條件的
Peoplenumbers = mylist[0].replace(",", "") # 替換逗号
Peoplenumbers = eval(Peoplenumbers) # str轉化為數字
#print(Peoplenumbers)
return tienumbers,Peoplenumbers
def gettiebalist(name): #抓取所有的符合name的頁數 輸入搜尋關鍵詞,傳回所有的頁數url
numberstuple=gettiebalistnumbers(name) #(元組)
tienumbers=numberstuple[1] #文章的數量
tiebalist = []
if tienumbers%54==0: #生成頁面清單
for i in range(tienumbers//54):
tiebalist.append("https://tieba.baidu.com/f?kw="+name+"&pn="+str(i*50))
else:
for i in range(tienumbers//54+1):
tiebalist.append("https://tieba.baidu.com/f?kw="+name+"&pn="+str(i*50))
#print(tiebalist)
return tiebalist
def geturllistformpage(url): #抓取頁面的每個文章url 輸入一頁url 傳回清單内的的所有url
headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0);"}
request = urllib.request.Request(url, headers=headers) # 發起請求,
# 也可以通過調⽤Request.add_header() 添加/修改⼀個特定的 header
response=urllib.request.urlopen(request)
data=response.read().decode("utf-8","ignore")#打開請求,抓取資料
#print(response.code) # 可以檢視響應狀态碼
restr = "<ul id=\"thread_list\" class=\"threadlist_bright j_threadlist_bright\" ([\s\S]*?)<div class=\"thread_list_bottom clearfix\" " # 正規表達式,()隻要括号内的資料
regex = re.compile(restr, re.IGNORECASE)
mylist = regex.findall(data)
#print(mylist[0])#抓取整個表格
restr = "href=\"/p/(\d+)\"" # 正規表達式,()隻要括号内的資料
regex = re.compile(restr, re.IGNORECASE)
urltitlelist = regex.findall(data)
#print(urltitlelist) #抓取的url變化的數字
urllist=[]
for title in urltitlelist:
urllist.append("http://tieba.baidu.com/p/"+title) #拼接連結
#print(urllist) #得到每個頁面的文章url清單
return urllist
def getallurllist(url): #擷取每一頁裡面的分頁 輸入一個文章url 輸出所有分頁url連結
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE"} # header 字典形式
request = urllib.request.Request(url, headers=headers) # 發送請求
# 也可以通過調用Request.add_header() 添加/修改一個特定的 header
response = urllib.request.urlopen(request) # 打開請求
tiebadata = response.read().decode("utf-8", "ignore") # 讀取資料
allurllist1=[]
restr = "共<span class=\"red\" (\d+)</span 頁</li " # 正規表達式,()隻要括号内的資料
regex = re.compile(restr, re.IGNORECASE)
numalllist = regex.findall(tiebadata)
nums=eval(numalllist[0])
for i in range(1,nums+1):
allurllist1.append(url+"?pn="+str(i))
return allurllist1
# print(urltitlelist) #抓取的url變化的數字
def getpagedata(url):
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE"} # header 字典形式
request = urllib.request.Request(url, headers=headers) # 發送請求
# 也可以通過調用Request.add_header() 添加/修改一個特定的 header
response = urllib.request.urlopen(request) # 打開請求
pagedata = response.read().decode("utf-8","ignore") #讀取資料
return pagedata
def getemaillistfrompage(pagedata): #在文章内頁面,把每一個郵箱抓取下來 輸入一個文章url 傳回郵箱
emaillist = []
restr = "[A-Z0-9._%+-]+[@][A-Z0-9.-]+\.[A-Z]{2,4}" # 正規表達式,()隻要括号内的資料
regex = re.compile(restr, re.IGNORECASE)
emaillist = regex.findall(pagedata)
return emaillist #傳回提取的郵箱清單
def QQlistfrompage(url): #在文章内頁面,把每一個郵箱抓取下來 輸入一個文章url 傳回QQ
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE"} # header 字典形式
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
#data = response.read().decode("utf-8","ignore") #讀取資料
QQlist = []
while True:
line = response.readline()
line = line.decode('utf-8')
if not line:
break
if line.find("QQ") != -1 or line.find("Qq") != -1 or line.find("qq") != -1:
restr = "[1-9]\\d{4,10}" # 正規表達式,()隻要括号内的資料
regex = re.compile(restr, re.IGNORECASE)
templist = regex.findall(line)
QQlist.extend(templist)
return QQlist
#print(gettiebalistnumbers("python"))
#print(gettiebalist("python3"))
#mylist=gettiebalist("python3")
#for line in mylist:
# print(line)
#geturllistformpage("https://tieba.baidu.com/f?kw=python3&ie=utf-8&pn=4000")
#print(getemaillistfrompage(getpagedata("http://tieba.baidu.com/p/6490450301")))
#print(QQlistfrompage("http://tieba.baidu.com/p/3950107421"))
"""
name="qqmail"
emailalllist=[]
for numberurl in gettiebalist(name): #取出這個關鍵詞 所有頁面的url
tieziurllist=geturllistformpage(numberurl) #取出每個頁面的 文章url
for fentieziurllist in tieziurllist:
tieziurllist1=getallurllist(fentieziurllist)
for pagetext in tieziurllist1:
pagedata=getpagedata(pagetext) #取出每個頁面的代碼
datas=getemaillistfrompage(pagedata) #正則提取郵箱
if len(datas) !=0: #如果提取的裡面一個頁面上的一個文章 郵箱不是空的話
emailalllist.append(datas[0])
print(emailalllist) #測試可以提取一個 貼吧的所有郵箱
"""
"""
name="qqmail"
QQalllist=[]
for numberurl in gettiebalist(name): #取出這個關鍵詞 所有頁面的url
tieziurllist=geturllistformpage(numberurl) #取出每個頁面的 文章url
for url in tieziurllist:
QQnumberlist=QQlistfrompage(url) #提取的裡面一個頁面上的一個文章的QQ
#print(QQnumberlist)
if len(QQnumberlist) != 0: #如果一個頁面QQ不為空的話
for qqdata in QQnumberlist: #一個頁面QQ清單周遊
QQalllist.append(qqdata) #添加到清單中
# qq=QQalllist.append(QQnumberlist[0])
#print(QQalllist)# #提取一個貼吧的所有QQ 測試成功
"""
name="qqmail"
savefilepath="qqmail_qq.txt"
savefile=open(savefilepath,"wb")
for numberurl in gettiebalist(name): #取出這個關鍵詞 所有頁面的url
tieziurllist=geturllistformpage(numberurl) #取出每個頁面的 文章url
for fenurl in tieziurllist:
tieziurllist1=getallurllist(fenurl) #一個頁面分頁的所有連結
for url in tieziurllist1:
QQnumberlist=QQlistfrompage(url) #提取的裡面一個頁面上的一個文章的QQ
#print(QQnumberlist)
if len(QQnumberlist) != 0: #如果一個頁面QQ不為空的話
print(QQnumberlist)
qqstr=" ".join(QQnumberlist)
savefile.write((qqstr+"\r\n").encode("utf-8"))
# qq=QQalllist.append(QQnumberlist[0])
#最後寫入檔案測試, 寫入qq.txt 69K
# TimeoutError: [WinError 10060] 由于連接配接方在一段時間後沒有正确答複或連接配接的主機沒有反應,連接配接嘗試失敗。
#可優化為timeout= 或者導入 import time 進行time.sleep(3) 睡眠定時通路操作,
#為避免出錯,還需再通路url時加入 try except 出錯避過
複制
知識點擴充:
Proxy 的設定
urllib2 預設會使用環境變量 http_proxy 來設定 HTTP Proxy。如果想在程式中明确控制 Proxy 而不受環境變量的影響,可以使用下面的方式
import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)
複制
這裡要注意的一個細節,使用 urllib2.install_opener() 會設定 urllib2 的全局 opener 。這樣後面的使用會很友善,但不能做更細粒度的控制,比如想在程式中使用兩個不同的 Proxy 設定等。比較好的做法是不使用 install_opener 去更改全局的設定,而隻是直接調用 opener 的 open 方法代替全局的 urlopen 方法。
以上就是python3用urllib抓取貼吧郵箱和QQ執行個體的詳細内容,更多關于python3中運用urllib抓取貼吧的郵箱以及QQ的資料請關注ZaLou.Cn其它相關文章!