如何用 Python 爬取社交网络

Python012

如何用 Python 爬取社交网络,第1张

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Author: Administrator

# @Date: 2015-10-31 15:45:27

# @Last Modified by: Administrator

# @Last Modified time: 2015-11-23 16:57:31

import requests

import sys

import json

import re

reload(sys)

sys.setdefaultencoding('utf-8')

#获取到匹配字符的字符串

def find(pattern,test):

finder = re.search(pattern, test)

start = finder.start()

end = finder.end()

return test[start:end-1]

cookies = {

'_ga':'GA1.2.10sdfsdfsdf', '_za':'8d570b05-b0b1-4c96-a441-faddff34',

'q_c1':'23ddd234234',

'_xsrf':'234id':'"ZTE3NWY2ZTsdfsdfsdfWM2YzYxZmE=|1446435757|15fef3b84e044c122ee0fe8959e606827d333134"',

'z_c0':'"QUFBQXhWNGZsdfsdRvWGxaeVRDMDRRVDJmSzJFN1JLVUJUT1VYaEtZYS13PT0=|14464e234767|57db366f67cc107a05f1dc8237af24b865573cbe5"',

'__utmt':'1', '__utma':'51854390.109883802f8.1417518721.1447917637.144c7922009.4',

'__utmb':'518542340.4.10.1447922009', '__utmc':'51123390', '__utmz':'5185435454sdf06.1.1.utmcsr=zhihu.com|utmcgcn=(referral)|utmcmd=referral|utmcct=/',

'__utmv':'51854340.1d200-1|2=registration_date=2028=1^3=entry_date=201330318=1'}

headers = {'user-agent':

'Mozilla/5.0 (Windows NT 6.1WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',

'referer':'http://www.zhihu.com/question/following',

'host':'www.zhihu.com','Origin':'http://www.zhihu.com',

'Content-Type':'application/x-www-form-urlencodedcharset=UTF-8',

'Connection':'keep-alive','X-Requested-With':'XMLHttpRequest','Content-Length':'81',

'Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,zhq=0.8','Connection':'keep-alive'

}

#多次访问之后,其实一加载时加载20个问题,具体参数传输就是offset,以20递增

dicc = {"offset":60}

n=20

b=0

# 与爬取图片相同的是,往下拉的时候也会发送http请求返回json数据,但是不同的是,像模拟登录首页不同的是除了

# 发送form表单的那些东西后,知乎是拒绝了我的请求了,刚开始以为是headers上的拦截,往headers添加浏览器

# 访问是的headers那些信息添加上,发现还是拒绝访问。

#想了一下,应该是cookie原因。这个加载的请求和模拟登录首页不同

#所以补上其他的cookies信息,再次请求,请求成功。

for x in xrange(20,460,20):

n = n+20

b = b+20

dicc['offset'] = x

formdata = {'method':'next','params':'{"offset":20}','_xsrf':'20770d88051f0f45e941570645f5e2e6'}

#传输需要json串,和python的字典是有区别的,需要转换

formdata['params'] = json.dumps(dicc)

# print json.dumps(dicc)

# print dicc

circle = requests.post("http://www.zhihu.com/node/ProfileFollowedQuestionsV2",

cookies=cookies,data=formdata,headers=headers)

#response内容 其实爬过一次之后就大同小异了。 都是

#问题返回的json串格式

# {"r":0,

# "msg": ["<div class=\"zm-profile-section-item zg-clear\">\n

# <span class=\"zm-profile-vote-count\">\n<div class=\"zm-profile-vote-num\">205K<\/div>\n

# <div class=\"zm-profile-vote-type\">\u6d4f\u89c8<\/div>\n

# <\/span>\n<div class=\"zm-profile-section-main\">\n

# <h2 class=\"zm-profile-question\">\n

# <a class=\"question_link\" target=\"_blank\" href=\"\/question\/21719532\">

# \u4ec0\u4e48\u4fc3\u4f7f\u4f60\u8d70\u4e0a\u72ec\u7acb\u5f00\u53d1\u8005\u4e4b\u8def\uff1f<\/a>\n

# <\/h2>\n<div class=\"meta zg-gray\">\n<a data-follow=\"q:link\" class=\"follow-link zg-unfollow meta-item\"

# href=\"javascript:\" id=\"sfb-868760\">

# <i class=\"z-icon-follow\"><\/i>\u53d6\u6d88\u5173\u6ce8<\/a>\n<span class=\"zg-bull\">•<\/span>\n63 \u4e2a\u56de\u7b54\n<span class=\"zg-bull\">•<\/span>\n3589 \u4eba\u5173\u6ce8\n<\/div>\n<\/div>\n<\/div>",

# "<div class=\"zm-profile-section-item zg-clear\">\n

# <span class=\"zm-profile-vote-count\">\n

# <div class=\"zm-profile-vote-num\">157K<\/div>\n

# <div class=\"zm-profile-vote-type\">\u6d4f\u89c8<\/div>\n

# <\/span>\n<div class=\"zm-profile-section-main\">\n

# <h2 class=\"zm-profile-question\">\n

# <a class=\"question_link\" target=\"_blank\" href=\"\/question\/31764065\">

# \u672c\u79d1\u6e23\u6821\u7684\u5b66\u751f\u5982\u4f55\u8fdb\u5165\u7f8e\u5e1d\u725b\u6821\u8bfbPhD\uff1f<\/a>\n

# <\/h2>\n<div class=\"meta zg-gray\">\n

# <a data-follow=\"q:link\" class=\"follow-link zg-unfollow meta-item\" href=\"javascript:\" id=\"sfb-4904877\">

# <i class=\"z-icon-follow\"><\/i>\u53d6\u6d88\u5173\u6ce8<\/a>\n<span class=\"zg-bull\">•

# <\/span>\n112 \u4e2a\u56de\u7b54\n<span class=\"zg-bull\">•<\/span>\n1582 \u4eba\u5173\u6ce8\n

# <\/div>\n<\/div>\n<\/div>"]}

# print circle.content

#同样json串需要自己 转换成字典后使用

jsondict = json.loads(circle.text)

msgstr = jsondict['msg']

# print len(msgstr)

#根据自己所需要的提取信息规则写出正则表达式

pattern = 'question\/.*?/a>'

try:

for y in xrange(0,20):

wholequestion = find(pattern, msgstr[y])

pattern2 = '>.*?<'

finalquestion = find(pattern2, wholequestion).replace('>','')

print str(b+y)+" "+finalquestion

#当问题已经访问完后再传参数 抛出异常 此时退出循环

except Exception, e:

print "全部%s个问题" %(b+y)

break

1、Web开发

由于Python是一种解释型的脚本语言,开发效率高,所以非常适合用来做Web开发。

Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快。常用的web开发框架有:Django、Flask、Tornado等。

由于后台服务器的通用性,除了狭义的网站之外,很多App和游戏的服务器端也同样用 Python实现。

2、网络爬虫

网络爬虫是Python比较常用的一个场景,国际上,google在早期大量地使用Python语言作为网络爬虫的基础,带动了整个Python语言的应用发展。以前国内很多人用采集器搜刮网上的内容,现在用Python收集网上的信息比以前容易很多了,如:

从各大网站爬取商品折扣信息,比较获取最优选择

对社交网络上发言进行收集分类,生成情绪地图,分析语言习惯

爬取网易云音乐某一类歌曲的所有评论,生成词云

按条件筛选获得豆瓣的电影书籍信息并生成表格……

3、人工智能

Python有很多库很方便做人工智能,比如numpy,

scipy做数值计算的,sklearn做机器学习的,pybrain做神经网络的,matplotlib将数据可视化的。在人工智能大范畴领域内的数据挖掘、机器学习、神经网络、深度学习等方面都是主流的编程语言,得到广泛的支持和应用。

人工智能的核心算法大部分还是依赖于C/C++的,因为是计算密集型,需要非常精细的优化,还需要GPU、专用硬件之类的接口,这些都只有C/C++能做到。

4、数据分析

数据分析处理方面,Python有很完备的生态环境。“大数据”分析中涉及到的分布式计算、数据可视化、数据库操作等,Python中都有成熟的模块可以选择完成其功能。

对于Hadoop-MapReduce和Spark,都可以直接使用Python完成计算逻辑,这无论对于数据科学家还是对于数据工程师而言都是十分便利的。

5、自动化运维

Python对于服务器运维而言也有十分重要的用途。由于目前几乎所有Linux发行版中都自带了Python解释器,使用Python脚本进行批量化的文件部署和运行调整都成了Linux服务器上很不错的选择。

Python中也包含许多方便的工具,从调控ssh/sftp用的paramiko,到监控服务用的supervisor,再到bazel等构建工具,甚至conan等用于C++的包管理工具,Python提供了全方位的工具集合,而在这基础上,结合Web,开发方便运维的工具会变得十分简单。