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。

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





  • 相关阅读:
    Leetcode Plus One
    Leetcode Swap Nodes in Pairs
    Leetcode Remove Nth Node From End of List
    leetcode Remove Duplicates from Sorted Array
    leetcode Remove Element
    leetcode Container With Most Water
    leetcode String to Integer (atoi)
    leetcode Palindrome Number
    leetcode Roman to Integer
    leetcode ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6884487.html
Copyright © 2011-2022 走看看