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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。