前言

本文讲解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 群信息相关推荐

  1. Python随笔|抓取QQ群成员头像

    最近需要用到QQ群成员的头像,但是,一个一个点开大家的头像再保存太麻烦了,所以就写了一段代码抓取一下. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪 ...

  2. python调用sql数据库进存销_python多进程快速批量爬取黄页海量信息并保存文本和数据库教程...

    最近帮朋友做一些网络营销的工作,需要抓取一些客源信息,用以辅助营销,我感觉很多做电商的朋友,尤其是微商朋友们,应该都是比较需要各种客源信息的吧,今天,小编我就借此机会把利用python多进程的方式抓取 ...

  3. php爬取qq好友,使用php批量抓取QQ空间相册链接

    前言 小杰之前发布的文章<为什么QQ空间与我们渐行渐远?> 里面就提到小杰会抽空备份QQ空间的照片,但是在网上找了很久也没有找到一个有效的工具 作为一个Phper,淦就完事了,所以顶着寒冷 ...

  4. python爬取新浪微博数据中心_Python爬虫框架Scrapy实战之批量抓取招聘信息

    网络爬虫抓取特定网站网页的html数据,但是一个网站有上千上万条数据,我们不可能知道网站网页的url地址,所以,要有个技巧去抓取网站的所有html页面.Scrapy是纯Python实现的爬虫框架,用户 ...

  5. python批量读取图片并批量保存_Python爬虫:批量抓取花瓣网高清美图并保存

    原标题:Python爬虫:批量抓取花瓣网高清美图并保存 昨天看到了不错的图片分享网--花瓣,里面的图片质量还不错,所以利用selenium+xpath我把它的妹子的栏目下爬取了下来,以图片栏目名称给文 ...

  6. python爬虫ip代理_python爬虫批量抓取ip代理的方法(代码)

    本篇文章给大家带来的内容是关于python爬虫批量抓取ip代理的方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 使用爬虫抓取数据时,经常要用到多个ip代理,防止单个ip访 ...

  7. python爬虫学习基础教程,批量抓取美女图片!

    python的抓取功能其实是非常强大的,当然不能浪费,呵呵.下面就与大家分享一个python写的美女图自动抓取程序吧! 其中用到urllib2模块和正则表达式模块.下面直接上代码: 用python批量 ...

  8. python爬取网店数据_Python爬虫实现抓取京东店铺信息及下载图片功能示例

    本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requ ...

  9. XHR如何爬虫_Python爬虫实战之抓取京东苹果手机评价

    1. 网站分析 本文实现的爬虫是抓取京东商城指定苹果手机的评论信息.使用 requests 抓取手机评论 API 信息,然后通过 json 模块的相应 API 将返回的 JSON 格式的字符串转换为 ...

最新文章

  1. 针对BCH阵营对立,BU开发组提出投票妥协策略
  2. 深入理解C代码中的注释
  3. java blob转file_人工智能-Object Detection API 模型转tflite并验证
  4. python 统计使用技巧
  5. boost::notify_all_at_thread_exit相关的测试程序
  6. Excel隐藏的数据处理技巧
  7. python2 pip安装包等出现各种编码错误UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2......
  8. Android之android.os.NewWorkOnMainThreadException解决办法
  9. 1 分钟记住 docker 镜像和容器常用基本命令
  10. python进阶17炫技巧
  11. ~~spfa 算法(队列优化的Bellman-Ford算法)(附模板题)
  12. linux mysql utf-8编码_笔记:linux下mysql设置utf-8编码方法
  13. rzsz工具 源码交叉编译
  14. Android自定义权限
  15. 历年系统架构师论文题目总结(2012-2018)
  16. 锁屏对对碰_锁屏应用
  17. 软考 - 软件设计师 - 完整知识点笔记 - 按考频整理
  18. 致远项目管理SPM系统案例:华仁药业股份有限公司合同管理
  19. 初探Linux--鸟哥私房菜读书笔记
  20. Linux选择填空练习题

热门文章

  1. QLExpress计算等本等息、等额本息、等额本金
  2. 红旗 linux 在哪儿 看 版本,简介红旗Linux不同版本的介绍
  3. 别坐在金矿上捡垃圾:给管理者的10条建议
  4. Transformers
  5. 原生与H5混合式开发详解
  6. HBase与Hadoop生态其他组件的联系
  7. 温湿度传感器驱动SHT85 单片机STM32 HAL库
  8. C++实现三维空间中点到点、点到直线、点到平面的距离计算
  9. 信息技术发展史及其趋势
  10. 微信——产品设计分析报告