python3用urllib抓取贴吧邮箱和QQ实例


Posted in Python onMarch 10, 2020

我们首先来看下实例代码:

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的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python修改操作系统时间的方法
May 18 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
python中字符串的操作方法大全
Jun 03 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
Python文件路径名的操作方法
Oct 30 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
Pytorch之扩充tensor的操作
Mar 04 Python
python目标检测给图画框,bbox画到图上并保存案例
Mar 10 #Python
python opencv 检测移动物体并截图保存实例
Mar 10 #Python
Python标准库json模块和pickle模块使用详解
Mar 10 #Python
Python xlrd excel文件操作代码实例
Mar 10 #Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 #Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 #Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 #Python
You might like
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
2016/11/26 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
Python完全新手教程
2007/02/08 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
什么是GWT的Module
2013/01/20 面试题
日语专业个人求职信范文
2014/02/02 职场文书
高级工程师英文求职信
2014/03/19 职场文书
投标承诺书范本
2014/03/27 职场文书
入职担保书怎么写
2014/05/12 职场文书
《观潮》教学反思
2016/02/17 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
go xorm框架的使用
2021/05/22 Golang
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
Pandas自定义选项option设置
2021/07/25 Python
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技