码迷,mamicode.com
首页 > 编程语言 > 详细

python 爬虫1 开始,先拿新浪微博开始

时间:2015-07-27 00:24:38      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:python   新浪微博   爬虫   面向对象   经验   

刚刚开始学。

目的地是两个,一个微博,一个贴吧

存入的话,暂时还没想那么多,先存到本地文件夹吧

分词和推荐后面在整合

mysql mongodb hadoop redius 后面在用


我终于知道为什么大家都推荐用python写爬虫了。。。我擦,一些开源的包实在写的太好了

我开始I还百思不得其解的为什么要用python这样的语言。我真的用起来很”蛋疼“

而且,我用这门语言真的像我当初用c语言一样的用的。纯粹的用面向过程的思想写。

一点一点墨迹。。。虽然我知道他有面向对象的特性。。。但是怎么都觉得不能习惯,不要说和C# .net 来比

我觉得和java 的风格也相差很大啊。而且即使比c或者matlab 虽然编码很快。但是关键字和运行调试机制还不是很熟悉。。。

你懂的,我很痛苦

直到我调试模拟认证……做过的人肯定会有经验,我之前工作用.net 做过爬虫(当时也就有个概念),

后来在学习过程里又用java 写过爬虫,爬阿里速卖通,结果失败了(我现在明白当时为什么我失败了,我当时都已经拿到Outh的ssid了

这个ssid 是 验证用户密码正确后发回的授权代码,只要有这个全局就不用认证。可是就是跳不到指定的页面,我现在觉得肯定是自动跳转location 

搞鬼,当然可能还有cookie的原因)但是在python包里完美解决了这两个问题,完全不用你担心。所有的cookie从第一个页面到最后目的页面全部接住了

全部写到文件,而且,最重要的是从请求登陆到指定主页之间的授权跳转request(仅仅是head头之间的跳转,完全没有页面)完全被自动化处理了

就像浏览器自己处理一样,这让我很是大喜啊。省了很多中间页面模拟的麻烦啊!!!!!!!!!!!!!!!!!!!!!!!


ubuntu14.04  python 自带,

安装了一个beautifulsoup 的 解析器 ,这里我装的是新版本,不是apt-get自带的版本

#安装版本4
apt-get install python-bs4 python-bs4-doc


技术分享


开始

import cookielib
import os
import re
import urllib
import urllib2
import math

auth_url = ‘http://www.weibo.cn‘
home_url = ‘http://www.weibo.cn‘;
filename=‘FileCookieJar.txt‘

#正则表达式一定要从小往大了写,先配对好配对的部分,先配对特征突出的部分,在往大了写,不然根本写不出来

#[\u4E00-\u9FA5] 这个表示中国字, 之前是没有加一对小括号的,加上表示取出group,在模式串前面写上u 表示unicode 编码的意思?

技术分享

#之前的大部分例子都是写上个r

reg=u"<a href=(‘http://login.weibo.cn/[^\u4E00-\u9FA5]*?)[>]+?[\u4E00-\u9FA5]{2}</a>" 
pattern=re.compile(reg)

req = urllib2.Request(home_url) 
req.add_header(‘User-Agent‘, ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)‘)

#这一步是把cookies 写入相应的文件

ckjar = cookielib.MozillaCookieJar(filename) 
ckproc = urllib2.HTTPCookieProcessor(ckjar)

opener = urllib2.build_opener(ckproc)

f = opener.open(req) 

#把吃下来的网页写成utf-8 的格式
htm = f.read().decode(‘utf-8‘)
f.close()
ckjar.save(ignore_discard=True, ignore_expires=True)
print htm

#如果要用group 就不能写findall,要用search 或者写finditer 这两个返回的都是match 对象,后面的返回的应该是match列表

#findall 返回的是列表不是match列表 ,finditer 返回的结果可以用 遍历 for match in result : print match.group(1) 
loginweb=pattern.search(htm).group(1)
print loginweb

#表示从第一个取到倒数第二个
loginweb=loginweb[1:-1]
print loginweb
params=loginweb.split(‘;‘)
for param in params:
    print param

wl=WeiboLogin(loginweb,"","")
wl.getweibologin()

这里补充一下:文件头一定要加:

#!/usr/bin/env python
#_*_ coding: utf-8_*_

不然中文的注释都会报错


接着用上了面向对象的思想

新建了一个类,这也是痛苦的作死过程,但是好歹最后学到了东西

#类会先执行这个函数,构造函数初始化,这个可以自己改,可以重载

def __init__(self, urlse,user, pwd):
        self.url=urlse


#定义拿到登陆页面的方法,想拿到第一步cookie

def getweibologin(self):
        filename=‘FileCookieJar.txt‘
        ckjar = cookielib.MozillaCookieJar(filename)
        print self.url
        req = urllib2.Request(self.url)
        req.add_header(‘User-Agent‘, ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)‘)
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )
        f = opener.open(req) 
        htm = f.read().decode(‘utf-8‘)
        f.close()
        ckjar.save(ignore_discard=True, ignore_expires=True)
        self.loginweb1(htm)

#模拟登陆的方法

def loginweb1(self,sweb):
        soup=BeautifulSoup(sweb)
        ##这里要用find不用findAll,因findall 拿到的是一系列标签的list

#并且后面大括号表示筛选条件,中括号表示取出标签对应的值
        resp1 = soup.find(‘input‘, attrs = {‘name‘:‘vk‘})[‘value‘]
        resp2=soup.find(‘input‘,attrs={‘name‘:‘backURL‘})[‘value‘]
        flag=resp1.split(‘_‘)[0] #python 从零开始
        passwordflag="password_"+flag
        print passwordflag
        filename=‘FileCookieJar.txt‘
        ckjar = cookielib.MozillaCookieJar(filename)
        rand=random.randint(500000000, 999999999)#生成随机数的方法

#这里也要注意,fiddler的页面请求没有主域名,这里我是把域名拼接起来的,这个真没办法。还有type 的控制,就是页面请求前面带上的http:// 

#至于是post传值还是get传值,这个包没有规定,如果data 有值就是post方法,如果没有值,那就是get ,但是get方法的请求连接一定要自己拼接好或者继承好

#这个就是精华地方,他从登陆到得到主页面 就这么一个步骤,中间的location的跳转过程全部自动完成,自动跳转。参数cookie全部继承,方便,又不会出错

#这样就完成了登陆过程,就可以找到人物关系,可以后面的步骤了

技术分享
        surl="http://login.weibo.cn/login/?rand="+str(rand)+"&backURL=http%3A%2F%2Fweibo.cn%2F&backTitle=%E5%BE%AE%E5%8D%9A&vt=4&revalid=2&ns=1"
        print surl
        req = urllib2.Request(surl)
        req.add_header(‘Accept‘,‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘)
        #req.add_header(‘Accept-Encoding‘,‘gzip, deflate‘) #之所以要注释掉它,是因为加上后,会影响后面的解析,压缩后的页面解析会出问题,干脆不要压缩
        req.add_header(‘Accept-Language‘,‘zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3‘)
        req.add_header(‘User-Agent‘, ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)‘)

        req.add_header(‘Referer‘,‘http://login.weibo.cn/login/?ns=1&revalid=2&backURL=http%3A%2F%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt=‘)
        postdata=urllib.urlencode({
                                   ‘mobile‘:‘账户‘,#这里换成你的账户
                                   passwordflag:‘密码‘,##这里换成你的密码
                                   ‘remember‘:‘on‘,
                                   ‘backURL‘  :  ‘http%3A%2F%2Fweibo.cn%2F‘,
                                   ‘backTitle‘  :  ‘微博‘,
                                   ‘tryCount‘   :‘‘,
                                   ‘vk‘  :  resp1,
                                   ‘submit‘  :  ‘登录‘
                                   })
        req.add_data(postdata)
        #req.add_header(‘host‘, ‘login.weibo.cn‘)#拼接域名的话就不必要填这两个了
        #req.host=‘login.weibo.cn‘
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )
        f = opener.open(req) 
        htm = f.read().decode(‘utf-8‘)
        print htm
        f.close()
        ckjar.save(ignore_discard=True, ignore_expires=True)
        self.findweibo(htm)

#解析定位到自己的微博

def findweibo(self,sweb):
        soup=BeautifulSoup(sweb)
        c=soup.find(‘div‘, attrs = {‘class‘:‘tip2‘})
        print c
        aim=BeautifulSoup(str(c))
        ax=aim.findAll(‘a‘)[0][‘href‘]
        print ax

#这里还补充一个调试技巧,因为分开类来写了,如果从头开始调试要很长步骤时间,而且反复登陆或者搜集同一个页面会被认为蜘蛛盗链

#所以在py 文件里 不是class里 和class 同级别缩进加入

if __name__ == ‘__main__‘:

    #写入调用方法的逻辑

用类名().具体方法(参数列表); #相当于实例化对象,然后调用里面方法,然后就可以直接跳到方法里去调试了


明天继续研究如何抽取微博数据,爱好社区和人物关系数据


补充fiddler 监测浏览器的时候,google chrome 会有问题,监测不了,不知道是不是代理的问题。。。不愿意深究了

我用的火狐浏览器测试是有用可以监测的。爬虫模拟的时候用的也是火狐header。

如果你暂停了一下,在继续监测可能就监测不了了,只能重开火狐才又恢复,不知道什么原因。





版权声明:本文为博主原创文章,未经博主允许不得转载。

python 爬虫1 开始,先拿新浪微博开始

标签:python   新浪微博   爬虫   面向对象   经验   

原文地址:http://blog.csdn.net/yuyi_000/article/details/47065403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!