qpython爬虫_python爬虫教程:批量抓取 QQ 群信息
前言
本文讲解Python批量抓取 QQ 群信息,包括群名称、群号、群人数、群主、地域、分类、标签、群简介等内容,返回 XLS / CSV / JSON 结果文件。
基本环境配置
版本:Python2.7
相关模块:bottle
requests
simplejson
pyexcel-xls
unicodecsv
代码实现部分截图
ps:这里推荐一下我的python零基础系统学习交流扣扣qun:322795889,学习python有不懂的(学习方法,学习路线,如何学习有效率的问题)可以加一下,群里有不错的学习教程,开发工具、电子书籍分享。专业的老师答疑
❆
源码分享:#!/usr/bin/env python
# -*- coding:utf-8 -*
import os
import sys
app_root = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(app_root, 'vendor'))
from bottle import *
import requests
from time import time, sleep
from random import random
try:
import ujson as json
except ImportError:
import simplejson as json
from io import BytesIO
import pyexcel as pe
import unicodecsv as csv
import re
import zipfile
from uuid import uuid4
#import sae
attachments = {}
sourceURL = 'http://find.qq.com/index.html?version=1&im_version=5533&width=910&height=610&search_target=0'
class QQGroups(object):
"""QQ Groups Spider"""
def __init__(self):
super(QQGroups, self).__init__()
self.js_ver = '10226'
self.newSession()
def newSession(self):
self.sess = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 QQ/8.9.3.21169 Safari/537.36'
}
self.sess.headers.update(headers)
return
def getQRCode(self):
self.newSession()
try:
url = 'http://ui.ptlogin2.qq.com/cgi-bin/login'
params = {
'appid': '715030901',
'daid': '73',
'pt_no_auth': '1',
's_url': sourceURL
}
resp = self.sess.get(url, params=params, timeout=1000)
pattern = r'imgcache\.qq\.com/ptlogin/ver/(\d+)/js'
try:
self.js_ver = re.search(pattern, resp.content).group(1)
except:
pass
self.sess.headers.update({'Referer': url})
url = 'http://ptlogin2.qq.com/ptqrshow'
params = {
'appid': '715030901',
'e': '2',
'l': 'M',
's': '3',
'd': '72',
'v': '4',
't': '%.17f' % (random()),
'daid': '73'
}
resp = self.sess.get(url, params=params, timeout=1000)
response.set_header('Content-Type', 'image/png')
response.add_header('Cache-Control', 'no-cache, no-store')
response.add_header('Pragma', 'no-cache')
except:
resp = None
return resp
def qrLogin(self):
login_sig = self.sess.cookies.get_dict().get('pt_login_sig', '')
qrsig = self.sess.cookies.get_dict().get('qrsig', '')
status = -1
errorMsg = ''
if all([login_sig, qrsig]):
url = 'http://ptlogin2.qq.com/ptqrlogin'
params = {
'u1': sourceURL,
'ptqrtoken': self.genqrtoken(qrsig),
'ptredirect': '1',
'h': '1',
't': '1',
'g': '1',
'from_ui': '1',
'ptlang': '2052',
'action': '0-0-%d' % (time() * 1000),
'js_ver': self.js_ver,
'js_type': '1',
'login_sig': login_sig,
'pt_uistyle': '40',
'aid': '715030901',
'daid': '73'
}
try:
resp = self.sess.get(url, params=params, timeout=1000)
result = resp.content
if '二维码未失效' in result:
status = 0
elif '二维码认证中' in result:
status = 1
elif '登录成功' in result:
status = 2
elif '二维码已失效' in result:
status = 3
else:
errorMsg = str(result.text)
except:
try:
errorMsg = str(resp.status_code)
except:
pass
loginResult = {
'status': status,
'time': time(),
'errorMsg': errorMsg,
}
resp = json.dumps(loginResult)
response.set_header('Content-Type', 'application/json; charset=UTF-8')
response.add_header('Cache-Control', 'no-cache; must-revalidate')
response.add_header('Expires', '-1')
return resp
def qqunSearch(self, request):
sort = request.forms.get('sort')
pn = int(request.forms.get('pn'))
ft = request.forms.get('ft')
kws = request.forms.get('kws').strip()
if not kws:
redirect('/qqun')
kws = re.sub(r'[\r\n]', '\t', kws)
kws = [k.strip() for k in kws.split('\t') if k.strip()]
self.sess.headers.update({'Referer': sourceURL})
skey = self.sess.cookies.get_dict().get('skey', '')
try:
buff = BytesIO()
zip_archive = zipfile.ZipFile(buff, mode='w')
temp = []
for i in xrange(len(kws)):
temp.append(BytesIO())
for i, kw in enumerate(kws[:10]):
groups = [(u'群名称', u'群号', u'群人数', u'群上限',
u'群主', u'地域', u'分类', u'标签', u'群简介')]
gListRaw = []
for page in xrange(0, pn):
# sort type: 0 deafult, 1 menber, 2 active
url = 'http://qun.qq.com/cgi-bin/group_search/pc_group_search'
data = {
'k': u'交友',
'n': '8',
'st': '1',
'iso': '1',
'src': '1',
'v': '4903',
'bkn': self.genbkn(skey),
'isRecommend': 'false',
'city_id': '0',
'from': '1',
'keyword': kw,
'sort': sort,
'wantnum': '24',
'page': page,
'ldw': self.genbkn(skey)
}
resp = self.sess.post(url, data=data, timeout=1000)
if resp.status_code != 200:
print '%s\n%s' % (resp.status_code, resp.text)
result = json.loads(resp.content)
gList = result['group_list']
gListRaw.extend(gList)
for g in gList:
name = self.rmWTS(g['name'])
code = g['code']
member_num = g['member_num']
max_member_num = g['max_member_num']
owner_uin = g['owner_uin']
qaddr = ' '.join(g['qaddr'])
try:
gcate = ' | '.join(g['gcate'])
except:
gcate = ''
try:
_labels = [l.get('label', '') for l in g['labels']]
labels = self.rmWTS(' | '.join(_labels))
except:
labels = ''
memo = self.rmWTS(g['memo'])
gMeta = (name, code, member_num, max_member_num,
owner_uin, qaddr, gcate, labels, memo)
groups.append(gMeta)
if len(gList) == 1:
break
sleep(2.5)
if ft == 'xls':
sheet = pe.Sheet(groups)
sheet.save_to_memory('xls', temp[i])
elif ft == 'csv':
writer = csv.writer(
temp[i], dialect='excel', encoding='utf-8')
writer.writerows(groups)
elif ft == 'json':
json.dump(gListRaw, temp[i], indent=4, sort_keys=True)
for i in xrange(len(kws)):
zip_archive.writestr(kws[i].decode(
'utf-8') + '.' + ft, temp[i].getvalue())
zip_archive.close()
resultId = uuid4().hex
attachments.update({resultId: buff})
response.set_header('Content-Type', 'text/html; charset=UTF-8')
response.add_header('Cache-Control', 'no-cache; must-revalidate')
response.add_header('Expires', '-1')
return resultId
except Exception, e:
print e
abort(500,)
def genqrtoken(self, qrsig):
e = 0
for i in xrange(0, len(qrsig)):
e += (e << 5) + ord(qrsig[i])
qrtoken = (e & 2147483647)
return str(qrtoken)
def genbkn(self, skey):
b = 5381
for i in xrange(0, len(skey)):
b += (b << 5) + ord(skey[i])
bkn = (b & 2147483647)
return str(bkn)
def rmWTS(self, content):
pattern = r'\[em\]e\d{4}\[/em\]| |
|[\r\n\t]'
content = re.sub(pattern, ' ', content)
content = content.replace('&', '&').strip()
return content
app = Bottle()
q = QQGroups()
@app.route('/static/')
def server_static(path):
return static_file(path, root='static')
@app.route('/')
def home():
redirect('/qqun')
@app.route('/qqun', method='ANY')
@view('qqun')
def qqun():
if request.method == 'GET':
response.set_header('Content-Type', 'text/html; charset=UTF-8')
response.add_header('Cache-Control', 'no-cache')
return
elif request.method == 'POST':
return q.qqunSearch(request)
@app.route('/getqrcode')
def getQRCode():
return q.getQRCode()
@app.route('/qrlogin')
def qrLogin():
return q.qrLogin()
@app.route('/download')
def download():
resultId = request.query.rid or ''
f = attachments.get(resultId, '')
if f:
response.set_header('Content-Type', 'application/zip')
response.add_header('Content-Disposition',
'attachment; filename="results.zip"')
return f.getvalue()
else:
abort(404)
### SAE ###
# debug(True)
# application = sae.create_wsgi_app(app)
### Local ###
if __name__ == '__main__':
# https://bottlepy.org/docs/dev/deployment.html#switching-the-server-backend
try:
run(app, server='paste', host='localhost',
port=8080, debug=True, reloader=True)
except:
run(app, host='localhost', port=8080, debug=True, reloader=True)
好啦!文章就给看官们分享到这儿
最后,如果觉得有帮助,记得关注、转发、收藏哟
·END·
qpython爬虫_python爬虫教程:批量抓取 QQ 群信息相关推荐
- Python随笔|抓取QQ群成员头像
最近需要用到QQ群成员的头像,但是,一个一个点开大家的头像再保存太麻烦了,所以就写了一段代码抓取一下. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪 ...
- python调用sql数据库进存销_python多进程快速批量爬取黄页海量信息并保存文本和数据库教程...
最近帮朋友做一些网络营销的工作,需要抓取一些客源信息,用以辅助营销,我感觉很多做电商的朋友,尤其是微商朋友们,应该都是比较需要各种客源信息的吧,今天,小编我就借此机会把利用python多进程的方式抓取 ...
- php爬取qq好友,使用php批量抓取QQ空间相册链接
前言 小杰之前发布的文章<为什么QQ空间与我们渐行渐远?> 里面就提到小杰会抽空备份QQ空间的照片,但是在网上找了很久也没有找到一个有效的工具 作为一个Phper,淦就完事了,所以顶着寒冷 ...
- python爬取新浪微博数据中心_Python爬虫框架Scrapy实战之批量抓取招聘信息
网络爬虫抓取特定网站网页的html数据,但是一个网站有上千上万条数据,我们不可能知道网站网页的url地址,所以,要有个技巧去抓取网站的所有html页面.Scrapy是纯Python实现的爬虫框架,用户 ...
- python批量读取图片并批量保存_Python爬虫:批量抓取花瓣网高清美图并保存
原标题:Python爬虫:批量抓取花瓣网高清美图并保存 昨天看到了不错的图片分享网--花瓣,里面的图片质量还不错,所以利用selenium+xpath我把它的妹子的栏目下爬取了下来,以图片栏目名称给文 ...
- python爬虫ip代理_python爬虫批量抓取ip代理的方法(代码)
本篇文章给大家带来的内容是关于python爬虫批量抓取ip代理的方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 使用爬虫抓取数据时,经常要用到多个ip代理,防止单个ip访 ...
- python爬虫学习基础教程,批量抓取美女图片!
python的抓取功能其实是非常强大的,当然不能浪费,呵呵.下面就与大家分享一个python写的美女图自动抓取程序吧! 其中用到urllib2模块和正则表达式模块.下面直接上代码: 用python批量 ...
- python爬取网店数据_Python爬虫实现抓取京东店铺信息及下载图片功能示例
本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requ ...
- XHR如何爬虫_Python爬虫实战之抓取京东苹果手机评价
1. 网站分析 本文实现的爬虫是抓取京东商城指定苹果手机的评论信息.使用 requests 抓取手机评论 API 信息,然后通过 json 模块的相应 API 将返回的 JSON 格式的字符串转换为 ...
最新文章
- 针对BCH阵营对立,BU开发组提出投票妥协策略
- 深入理解C代码中的注释
- java blob转file_人工智能-Object Detection API 模型转tflite并验证
- python 统计使用技巧
- boost::notify_all_at_thread_exit相关的测试程序
- Excel隐藏的数据处理技巧
- python2 pip安装包等出现各种编码错误UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2......
- Android之android.os.NewWorkOnMainThreadException解决办法
- 1 分钟记住 docker 镜像和容器常用基本命令
- python进阶17炫技巧
- ~~spfa 算法(队列优化的Bellman-Ford算法)(附模板题)
- linux mysql utf-8编码_笔记:linux下mysql设置utf-8编码方法
- rzsz工具 源码交叉编译
- Android自定义权限
- 历年系统架构师论文题目总结(2012-2018)
- 锁屏对对碰_锁屏应用
- 软考 - 软件设计师 - 完整知识点笔记 - 按考频整理
- 致远项目管理SPM系统案例:华仁药业股份有限公司合同管理
- 初探Linux--鸟哥私房菜读书笔记
- Linux选择填空练习题