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自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
python dataframe 输出结果整行显示的方法
Jun 14 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
详解使用Python下载文件的几种方法
Oct 13 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
python线程信号量semaphore使用解析
Nov 30 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
基于python实现计算两组数据P值
Jul 10 Python
Django多个app urls配置代码实例
Nov 26 Python
Python常遇到的错误和异常
Nov 02 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
PHP闭包(Closure)使用详解
2013/05/02 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
js下写一个事件队列操作函数
2010/07/19 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
2019/11/10 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
跟老齐学Python之变量和参数
2014/10/10 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
分享Python文本生成二维码实例
2016/01/06 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
Python实现注册、登录小程序功能
2018/09/21 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
四种会话跟踪技术
2015/05/20 面试题
大四学生找工作的自荐信
2014/03/27 职场文书
推荐信怎么写
2014/05/09 职场文书
擅自离岗检讨书
2014/09/12 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
见习报告格式范文
2014/11/08 职场文书
我在伊朗长大观后感
2015/06/16 职场文书