python3用urllib抓取贴吧邮箱和QQ实例
作者:共感的艺术 发布时间:2022-05-15 16:25:18
标签:python3,urllib
我们首先来看下实例代码:
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 方法。
来源:https://www.cnblogs.com/my-global/p/12454039.html
0
投稿
猜你喜欢
- 之前用bash实现过(https://www.jb51.net/article/61943.htm),不过那个不能在windows下使用,所
- 对象:是抽象的概念 如列表 元组 字典 集合 皆为对象序列化:一种方法。目的:把对象存储在磁盘上(即,将对象转换为字节数据/字符数据)。这一
- 原文链接:https://blog.csdn.net/Fairy_Nan/article/details/105914203HDF也是一种自
- 回顾面向对象编程让我们先用 30 秒钟来回顾一下 OOP 到底是什么。在面向对象编程语言中,可以定义 类,它们的用途是将相关的数据和行为捆绑
- 随着大数据时代的到来,数据将如同煤电气油一样,成为我们最重要的能源之一,然而这种能源是可以源源不断产生、可再生的。而Python爬虫作为获取
- 本文详细介绍了网站的反爬虫策略,在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下。从功能上来讲,爬虫一般分为数据采集,处理,储存
- Flask是一个用Python编写的Web应用程序框架,Flask是python的web框架,最大的特征是轻便,让开发者自由灵活的兼容要开发
- 好了,看看我们的代码吧:upload.htm' 上传页面<html> <body>&nb
- 今天遇到了这样一个问题,使用matplotlib绘制热图数组中横纵坐标自然是图片的像素排列顺序,但是这样带来的问题就是画出来的x,y轴中坐标
- 一、home页使用frametemplate/home.html<!DOCTYPE html><html lang=&qu
- 官方函数DataFrame.locAccess a group of rows and columns by label(s) or a b
- create or replace PROCEDURE proceudre_name AS BEGIN DECLARE sPara VARC
- 前言thinkphp3.1.2 需要使用cli方法运行脚本折腾了一天才搞定3.1.2的版本真的很古老解决增加cli.php入口文件defin
- 本文实例讲述了Python 面向对象之类class和对象基本用法。分享给大家供大家参考,具体如下:类(class):定义一件事物的抽象特点,
- list1 和list2 两个list , 想要得到list1是不是包含 list2 (是不是其子集 )a = [1,2] b = [1,2
- 前言语音合成技术能将用户输入的文字,转换成流畅自然的语音输出,并且可以支持语速、音调、音量设置,打破传统文字式人机交互的方式,让人机沟通更自
- 本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据
- 前言本文主要介绍的是关于python 3用BeautifulSoup抓取div标签的方法示例,分享出来供大家参考学习,下面来看看详细的介绍:
- python实现简单神经网络算法,供大家参考,具体内容如下python实现二层神经网络包括输入层和输出层import numpy as np
- 交待:使用的软硬件环境为Win XP SP2、SQL Server 2000 SP2个人版、普通双核台式机、1000M局域网,A机为已使用的