python3用urllib抓取贴吧邮箱和QQ实例
我们首先来看下实例代码:
importurllib importurllib.request importre fromurllibimportparse #抓取贴吧页面数量信息 defgettiebalistnumbers(name):#计算搜索的关键词有多少页输入名字返回页数 url="https://tieba.baidu.com/f?" headers={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36QIHU360SE"}#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="([\s\S]*?)"#正则这个贴吧有多少帖子 regex=re.compile(restr,re.IGNORECASE) mylist=regex.findall(data)#寻找页面所有符合条件的 tienumbers=mylist[0].replace(",","")#替换逗号 tienumbers=eval(tienumbers)#str转化为数字 #print(tienumbers) restr=" ([\s\S]*?)"#正则关注贴吧的数 regex=re.compile(restr,re.IGNORECASE) mylist=regex.findall(data)#寻找页面所有符合条件的 Peoplenumbers=mylist[0].replace(",","")#替换逗号 Peoplenumbers=eval(Peoplenumbers)#str转化为数字 #print(Peoplenumbers) returntienumbers,Peoplenumbers defgettiebalist(name):#抓取所有的符合name的页数输入搜索关键词,返回所有的页数url numberstuple=gettiebalistnumbers(name)#(元组) tienumbers=numberstuple[1]#帖子的数量 tiebalist=[] iftienumbers%54==0:#生成页面列表 foriinrange(tienumbers//54): tiebalist.append("https://tieba.baidu.com/f?kw="+name+"&pn="+str(i*50)) else: foriinrange(tienumbers//54+1): tiebalist.append("https://tieba.baidu.com/f?kw="+name+"&pn="+str(i*50)) #print(tiebalist) returntiebalist defgeturllistformpage(url):#抓取页面的每个帖子url输入一页url返回列表内的的所有url headers={"User-Agent":"Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.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=" ([\s\S]*?) "#正则表达式,()只要括号内的数据 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=[] fortitleinurltitlelist: urllist.append("http://tieba.baidu.com/p/"+title)#拼接链接 #print(urllist)#得到每个页面的帖子url列表 returnurllist defgetallurllist(url):#获取每一页里面的分页输入一个帖子url输出所有分页url链接 headers={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36QIHU360SE"}#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="共 (\d+)页"#正则表达式,()只要括号内的数据 regex=re.compile(restr,re.IGNORECASE) numalllist=regex.findall(tiebadata) nums=eval(numalllist[0]) foriinrange(1,nums+1): allurllist1.append(url+"?pn="+str(i)) returnallurllist1 #print(urltitlelist)#抓取的url变化的数字 defgetpagedata(url): headers={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36QIHU360SE"}#header字典形式 request=urllib.request.Request(url,headers=headers)#发送请求 #也可以通过调用Request.add_header()添加/修改一个特定的header response=urllib.request.urlopen(request)#打开请求 pagedata=response.read().decode("utf-8","ignore")#读取数据 returnpagedata defgetemaillistfrompage(pagedata):#在帖子内页面,把每一个邮箱抓取下来输入一个帖子url返回邮箱 emaillist=[] restr="[A-Z0-9._%+-]+[@][A-Z0-9.-]+\.[A-Z]{2,4}"#正则表达式,()只要括号内的数据 regex=re.compile(restr,re.IGNORECASE) emaillist=regex.findall(pagedata) returnemaillist#返回提取的邮箱列表 defQQlistfrompage(url):#在帖子内页面,把每一个邮箱抓取下来输入一个帖子url返回QQ headers={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36QIHU360SE"}#header字典形式 request=urllib.request.Request(url,headers=headers) response=urllib.request.urlopen(request) #data=response.read().decode("utf-8","ignore")#读取数据 QQlist=[] whileTrue: line=response.readline() line=line.decode('utf-8') ifnotline: break ifline.find("QQ")!=-1orline.find("Qq")!=-1orline.find("qq")!=-1: restr="[1-9]\\d{4,10}"#正则表达式,()只要括号内的数据 regex=re.compile(restr,re.IGNORECASE) templist=regex.findall(line) QQlist.extend(templist) returnQQlist #print(gettiebalistnumbers("python")) #print(gettiebalist("python3")) #mylist=gettiebalist("python3") #forlineinmylist: #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=[] fornumberurlingettiebalist(name):#取出这个关键词所有页面的url tieziurllist=geturllistformpage(numberurl)#取出每个页面的帖子url forfentieziurllistintieziurllist: tieziurllist1=getallurllist(fentieziurllist) forpagetextintieziurllist1: pagedata=getpagedata(pagetext)#取出每个页面的代码 datas=getemaillistfrompage(pagedata)#正则提取邮箱 iflen(datas)!=0:#如果提取的里面一个页面上的一个帖子邮箱不是空的话 emailalllist.append(datas[0]) print(emailalllist)#测试可以提取一个贴吧的所有邮箱 """ """ name="qqmail" QQalllist=[] fornumberurlingettiebalist(name):#取出这个关键词所有页面的url tieziurllist=geturllistformpage(numberurl)#取出每个页面的帖子url forurlintieziurllist: QQnumberlist=QQlistfrompage(url)#提取的里面一个页面上的一个帖子的QQ #print(QQnumberlist) iflen(QQnumberlist)!=0:#如果一个页面QQ不为空的话 forqqdatainQQnumberlist:#一个页面QQ列表遍历 QQalllist.append(qqdata)#添加到列表中 #qq=QQalllist.append(QQnumberlist[0]) #print(QQalllist)##提取一个贴吧的所有QQ测试成功 """ name="qqmail" savefilepath="qqmail_qq.txt" savefile=open(savefilepath,"wb") fornumberurlingettiebalist(name):#取出这个关键词所有页面的url tieziurllist=geturllistformpage(numberurl)#取出每个页面的帖子url forfenurlintieziurllist: tieziurllist1=getallurllist(fenurl)#一个页面分页的所有链接 forurlintieziurllist1: QQnumberlist=QQlistfrompage(url)#提取的里面一个页面上的一个帖子的QQ #print(QQnumberlist) iflen(QQnumberlist)!=0:#如果一个页面QQ不为空的话 print(QQnumberlist) qqstr="".join(QQnumberlist) savefile.write((qqstr+"\r\n").encode("utf-8")) #qq=QQalllist.append(QQnumberlist[0]) #最后写入文件测试,写入qq.txt69K #TimeoutError:[WinError10060]由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 #可优化为timeout=或者导入importtime进行time.sleep(3)睡眠定时访问操作, #为避免出错,还需再访问url时加入tryexcept出错避过
知识点扩充:
Proxy的设置
urllib2默认会使用环境变量http_proxy来设置HTTPProxy。如果想在程序中明确控制Proxy而不受环境变量的影响,可以使用下面的方式
importurllib2 enable_proxy=True proxy_handler=urllib2.ProxyHandler({"http":'http://some-proxy.com:8080'}) null_proxy_handler=urllib2.ProxyHandler({}) ifenable_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的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。