我们首先来看下实例代码:
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的资料请关注小牛知识库其它相关文章!
本文向大家介绍python3使用QQ邮箱发送邮件,包括了python3使用QQ邮箱发送邮件的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python3使用QQ邮箱发邮件的具体代码,供大家参考,具体内容如下 直接上代码 如果登录失败可能是你的qq邮箱没有启动SMTP 解决: 启动后QQ会提供授权码,将代码中密码改为授权码即可。 成功后: 以上就是本文的全部内容,希望对大家的学习有所帮
主要内容:判断页面类型,寻找URL变化规律,编写爬虫程序,爬虫程序结构,爬虫程序随机休眠本节继续讲解 Python 爬虫实战案例:抓取百度贴吧( https://tieba.baidu.com/)页面,比如 Python爬虫吧、编程吧,只抓取贴吧的前 5 个页面即可。本节我们将使用面向对象的编程方法来编写程序。 判断页面类型 通过简单的分析可以得知,待抓取的百度贴吧页面属于静态网页,分析方法非常简单:打开百度贴吧,搜索“Python爬虫”,在出现的页面中复制任意一段信息,比如“爬虫需
本文向大家介绍Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解,包括了Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解的使用技巧和注意事项,需要的朋友参考一下 直接上代码实例: QQ邮箱设置 更多关于Python使用QQ邮箱发送邮件的实例请查看下面的相关链接
本文向大家介绍python3+selenium实现qq邮箱登陆并发送邮件功能,包括了python3+selenium实现qq邮箱登陆并发送邮件功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python3实现qq邮箱登陆并发送邮件功能的具体代码,供大家参考,具体内容如下 基于selenium,使用chrome浏览器,完成qq邮箱登陆并发送发邮件功能,暂时未封装。qq邮箱和126邮
本文向大家介绍python实现QQ邮箱/163邮箱的邮件发送,包括了python实现QQ邮箱/163邮箱的邮件发送的使用技巧和注意事项,需要的朋友参考一下 QQ邮箱/163邮箱的邮件发送:py文件发送邮件内容相当于一个第三方的客户端,借助于QQ/163邮箱服务器来发送的邮件。 主要配置: 导入模块——import smtplib 邮箱SMTP服务器的主机地址,HOST——将来使用这个服务器收
本文向大家介绍C#实现QQ邮箱发送邮件,包括了C#实现QQ邮箱发送邮件的使用技巧和注意事项,需要的朋友参考一下 闲着蛋疼。计划着改善公司的邮件服务。怎料公司网络封闭的太厉害了。我只能在家里利用开放点的网络来测试发送邮件; 利用qq邮箱发送到公司的企业邮箱上; 前提准备,登陆qq邮箱开启stmp服务。不开启的话没法通过代码登陆到你的邮箱; 查询腾讯qq邮箱的smtp主机地址为:smtp.qq.com