您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)python3如何使用urllib抓取貼吧郵箱和QQ,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
我們首先來(lái)看下實(shí)例代碼:
import urllib import urllib.request import re from urllib import parse #抓取貼吧頁(yè)面數(shù)量信息 def gettiebalistnumbers(name): #計(jì)算搜索的關(guān)鍵詞有多少頁(yè) 輸入名字 返回頁(yè)數(shù) 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) # 發(fā)送請(qǐng)求 # 也可以通過(guò)調(diào)用Request.add_header() 添加/修改一個(gè)特定的 header request.add_header("Connection", "keep-alive") # 一直活著 response = urllib.request.urlopen(request) # 打開請(qǐng)求 data = response.read().decode("utf-8") # 讀取數(shù)據(jù) print(response.code) # 可以查看相應(yīng)狀態(tài)碼 restr = "<span class=\"card_infoNum\">([\s\S]*?)</span>" # 正則這個(gè)貼吧有多少帖子 regex = re.compile(restr, re.IGNORECASE) mylist = regex.findall(data) #尋找頁(yè)面所有符合條件的 tienumbers = mylist[0].replace(",","") #替換逗號(hào) tienumbers = eval(tienumbers) #str轉(zhuǎn)化為數(shù)字 #print(tienumbers) restr = "<span class=\"card_menNum\">([\s\S]*?)</span>" # 正則關(guān)注貼吧的數(shù) regex = re.compile(restr, re.IGNORECASE) mylist = regex.findall(data) # 尋找頁(yè)面所有符合條件的 Peoplenumbers = mylist[0].replace(",", "") # 替換逗號(hào) Peoplenumbers = eval(Peoplenumbers) # str轉(zhuǎn)化為數(shù)字 #print(Peoplenumbers) return tienumbers,Peoplenumbers def gettiebalist(name): #抓取所有的符合name的頁(yè)數(shù) 輸入搜索關(guān)鍵詞,返回所有的頁(yè)數(shù)url numberstuple=gettiebalistnumbers(name) #(元組) tienumbers=numberstuple[1] #帖子的數(shù)量 tiebalist = [] if tienumbers%54==0: #生成頁(yè)面列表 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): #抓取頁(yè)面的每個(gè)帖子url 輸入一頁(yè)url 返回列表內(nèi)的的所有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) # 發(fā)起請(qǐng)求, # 也可以通過(guò)調(diào)?Request.add_header() 添加/修改?個(gè)特定的 header response=urllib.request.urlopen(request) data=response.read().decode("utf-8","ignore")#打開請(qǐng)求,抓取數(shù)據(jù) #print(response.code) # 可以查看響應(yīng)狀態(tài)碼 restr = "<ul id=\"thread_list\" class=\"threadlist_bright j_threadlist_bright\">([\s\S]*?)<div class=\"thread_list_bottom clearfix\">" # 正則表達(dá)式,()只要括號(hào)內(nèi)的數(shù)據(jù) regex = re.compile(restr, re.IGNORECASE) mylist = regex.findall(data) #print(mylist[0])#抓取整個(gè)表格 restr = "href=\"/p/(\d+)\"" # 正則表達(dá)式,()只要括號(hào)內(nèi)的數(shù)據(jù) regex = re.compile(restr, re.IGNORECASE) urltitlelist = regex.findall(data) #print(urltitlelist) #抓取的url變化的數(shù)字 urllist=[] for title in urltitlelist: urllist.append("http://tieba.baidu.com/p/"+title) #拼接鏈接 #print(urllist) #得到每個(gè)頁(yè)面的帖子url列表 return urllist def getallurllist(url): #獲取每一頁(yè)里面的分頁(yè) 輸入一個(gè)帖子url 輸出所有分頁(yè)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) # 發(fā)送請(qǐng)求 # 也可以通過(guò)調(diào)用Request.add_header() 添加/修改一個(gè)特定的 header response = urllib.request.urlopen(request) # 打開請(qǐng)求 tiebadata = response.read().decode("utf-8", "ignore") # 讀取數(shù)據(jù) allurllist1=[] restr = "共<span class=\"red\">(\d+)</span>頁(yè)</li>" # 正則表達(dá)式,()只要括號(hào)內(nèi)的數(shù)據(jù) 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變化的數(shù)字 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) # 發(fā)送請(qǐng)求 # 也可以通過(guò)調(diào)用Request.add_header() 添加/修改一個(gè)特定的 header response = urllib.request.urlopen(request) # 打開請(qǐng)求 pagedata = response.read().decode("utf-8","ignore") #讀取數(shù)據(jù) return pagedata def getemaillistfrompage(pagedata): #在帖子內(nèi)頁(yè)面,把每一個(gè)郵箱抓取下來(lái) 輸入一個(gè)帖子url 返回郵箱 emaillist = [] restr = "[A-Z0-9._%+-]+[@][A-Z0-9.-]+\.[A-Z]{2,4}" # 正則表達(dá)式,()只要括號(hào)內(nèi)的數(shù)據(jù) regex = re.compile(restr, re.IGNORECASE) emaillist = regex.findall(pagedata) return emaillist #返回提取的郵箱列表 def QQlistfrompage(url): #在帖子內(nèi)頁(yè)面,把每一個(gè)郵箱抓取下來(lái) 輸入一個(gè)帖子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") #讀取數(shù)據(jù) 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}" # 正則表達(dá)式,()只要括號(hào)內(nèi)的數(shù)據(jù) 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): #取出這個(gè)關(guān)鍵詞 所有頁(yè)面的url tieziurllist=geturllistformpage(numberurl) #取出每個(gè)頁(yè)面的 帖子url for fentieziurllist in tieziurllist: tieziurllist1=getallurllist(fentieziurllist) for pagetext in tieziurllist1: pagedata=getpagedata(pagetext) #取出每個(gè)頁(yè)面的代碼 datas=getemaillistfrompage(pagedata) #正則提取郵箱 if len(datas) !=0: #如果提取的里面一個(gè)頁(yè)面上的一個(gè)帖子 郵箱不是空的話 emailalllist.append(datas[0]) print(emailalllist) #測(cè)試可以提取一個(gè) 貼吧的所有郵箱 """ """ name="qqmail" QQalllist=[] for numberurl in gettiebalist(name): #取出這個(gè)關(guān)鍵詞 所有頁(yè)面的url tieziurllist=geturllistformpage(numberurl) #取出每個(gè)頁(yè)面的 帖子url for url in tieziurllist: QQnumberlist=QQlistfrompage(url) #提取的里面一個(gè)頁(yè)面上的一個(gè)帖子的QQ #print(QQnumberlist) if len(QQnumberlist) != 0: #如果一個(gè)頁(yè)面QQ不為空的話 for qqdata in QQnumberlist: #一個(gè)頁(yè)面QQ列表遍歷 QQalllist.append(qqdata) #添加到列表中 # qq=QQalllist.append(QQnumberlist[0]) #print(QQalllist)# #提取一個(gè)貼吧的所有QQ 測(cè)試成功 """ name="qqmail" savefilepath="qqmail_qq.txt" savefile=open(savefilepath,"wb") for numberurl in gettiebalist(name): #取出這個(gè)關(guān)鍵詞 所有頁(yè)面的url tieziurllist=geturllistformpage(numberurl) #取出每個(gè)頁(yè)面的 帖子url for fenurl in tieziurllist: tieziurllist1=getallurllist(fenurl) #一個(gè)頁(yè)面分頁(yè)的所有鏈接 for url in tieziurllist1: QQnumberlist=QQlistfrompage(url) #提取的里面一個(gè)頁(yè)面上的一個(gè)帖子的QQ #print(QQnumberlist) if len(QQnumberlist) != 0: #如果一個(gè)頁(yè)面QQ不為空的話 print(QQnumberlist) qqstr=" ".join(QQnumberlist) savefile.write((qqstr+"\r\n").encode("utf-8")) # qq=QQalllist.append(QQnumberlist[0]) #最后寫入文件測(cè)試, 寫入qq.txt 69K # TimeoutError: [WinError 10060] 由于連接方在一段時(shí)間后沒有正確答復(fù)或連接的主機(jī)沒有反應(yīng),連接嘗試失敗。 #可優(yōu)化為timeout= 或者導(dǎo)入 import time 進(jìn)行time.sleep(3) 睡眠定時(shí)訪問(wèn)操作, #為避免出錯(cuò),還需再訪問(wèn)url時(shí)加入 try except 出錯(cuò)避過(guò)
知識(shí)點(diǎn)擴(kuò)充:
Proxy 的設(shè)置
urllib2 默認(rèn)會(huì)使用環(huán)境變量 http_proxy 來(lái)設(shè)置 HTTP Proxy。如果想在程序中明確控制 Proxy 而不受環(huán)境變量的影響,可以使用下面的方式
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)
這里要注意的一個(gè)細(xì)節(jié),使用 urllib2.install_opener() 會(huì)設(shè)置 urllib2 的全局 opener 。這樣后面的使用會(huì)很方便,但不能做更細(xì)粒度的控制,比如想在程序中使用兩個(gè)不同的 Proxy 設(shè)置等。比較好的做法是不使用 install_opener 去更改全局的設(shè)置,而只是直接調(diào)用 opener 的 open 方法代替全局的 urlopen 方法。
關(guān)于“python3如何使用urllib抓取貼吧郵箱和QQ”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。