zoukankan      html  css  js  c++  java
  • python 爬虫1 開始,先拿新浪微博開始

    刚刚開始学。

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

    存入的话,临时还没想那么多。先存到本地目录吧

    分词和推荐后面在整合

    mysql mongodb hadoop redius 后面在用


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

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

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

    一点一点墨迹。。

    。尽管我知道他有面向对象的特性。。

    可是怎么都认为不能习惯,不要说和C# .net 来比

    我认为和java 的风格也相差非常大啊。并且即使比c或者matlab 尽管编码非常快。可是keyword和执行调试机制还不是非常熟悉。

    。。

    你懂的。我非常痛苦

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

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

    这个ssid 是 验证用户password正确后发回的授权代码,仅仅要有这个全局就不用认证。但是就是跳不到指定的页面。我如今认为肯定是自己主动跳转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:'password',##这里换成你的password
                                       '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。

    假设你暂停了一下。在继续监測可能就监測不了了,仅仅能重开火狐才又恢复,不知道什么原因。





  • 相关阅读:
    ARP投毒攻击
    sniffer简单使用
    MAC泛洪攻击
    又是一题反序列化了解一下???
    关于parse_str变量覆盖分析
    超级ping(多线程版)
    文本输入框input将输入转换为统一大小写
    通俗易懂JSONP讲解
    通俗易懂JSONP讲解
    Fastjson主要接口和类库说明
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6884487.html
Copyright © 2011-2022 走看看