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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
python脚本替换指定行实现步骤
Jul 11 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
python框架flask入门之路由及简单实现方法
Jun 07 Python
Python socket服务常用操作代码实例
Jun 22 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
pytorch 中forward 的用法与解释说明
Feb 26 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
自动分页的不完整解决方案
2007/01/12 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
PHP缓冲区用法总结
2016/02/14 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
Python实现的tab文件操作类分享
2014/11/20 Python
分享vim python缩进等一些配置
2018/07/02 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
大学国际贸易专业自荐信
2014/06/05 职场文书
个人授权委托书格式
2014/08/30 职场文书
证婚人致辞精选
2015/07/28 职场文书
美容院员工规章制度
2015/08/05 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL