用python爬取QQ空间

      很久没写博文了,最近捣鼓了一下python,好像有点上瘾了,感受python比js厉害好多,可是接触不久,只看了《[你们网]Python基础教程(第2版)[www.TopSage.com]》的前7章,好多东西还不会,能作的也比较少。我想作的是爬QQ空间,而后把空间里的留言,说说拷下来,已经成功作到了,只是,拷下来是word文档,看着没有在线看那么有感触,有些话,以为不像本身会说的。css

      我花了好多时间,幸亏最近悠闲,有时间给我慢慢学。一开始,我使用urllib去登录QQ空间:html

def getCookieOpener():
    postUrl="http://qzone.qq.com"
    cj = cookielib.LWPCookieJar()
    cookie_support = urllib2.HTTPCookieProcessor(cj)
    opener = urllib2.build_opener(cookie_support)
    postData={
        "app":"adv",
        "return":"http://user.qzone.qq.com/",
        "username":"登录名",
        "password":"登录密码"
    }
    postData = urllib.urlencode(postData)
    loginRequest = opener.open(postUrl,postData)
    return opener

会报错,建议我登录手机端页面,几番尝试,都不行,我去百度,果真,在我前面已经有好多人实践过了。查到了使用selenium中的webdriver库模拟浏览器操做,第六感告诉我,这个很是好,能够作不少事情。立马在cmd里安装这个包:pip install selenium,而后研究了下网上的一个例子:http://www.zh30.com/python-selenium-qzone-login.html,发现selenium的使用方法很是简单,查找元素并点击之类的操做和js有点类似,看完,开始本身动手,结果报错了,不管是尝试driver = webdriver.Chrome()仍是driver = webdriver.Firefox(),都是报错:python

我查到模拟谷歌浏览器要装个chromedriver.exe来辅助,可是火狐没说须要耶,猜测是否是要装个python3版本才行,目前用的是python2.7,结果仍是报同样的错误,实在没辙了,就装了个chromedriver.exe,模拟谷歌,毕竟谷歌浏览器我用得最多。python3的语法和python2有区别,最早发现的是print方法。原来,新版的火狐浏览器也须要安装点什么东西才行,有个新加入博客的伙伴回复了个人评论:web

原谅个人孤闻,其实不少东西我都不懂。chrome

      好了,程序终于能跑了,神奇的事情发生了,程序打开了一个新的谷歌页面,按照代码所写的打开了QQ登录页,而后自动填进了名称和密码,自动点击提交按钮,成功登录了,我愣了愣,原来所说的模拟登录是这么的可视化,真好。而后我开始研究怎么把本身的全部留言都导出来。先说一个把内容下载到txt或者其余格式的方法:浏览器

#日志文件
def logToFile(content,name="liuyan.txt"):
    fileH=open(name,"a+")
    try:
        print(content)
        fileH.write(content+"\n")
    except Exception as e:
        print("except:"+str(e))
    finally:
        fileH.close()

接下来就是获取问题了,我要获取li里的内容,而后翻到下一页,继续获取,直到所有获取完毕,留言板html结果以下图:cookie

个人核心代码是:app

def getData():
    num=1
    while (num<265):
        num+=1
        time.sleep(2)
        memu=driver.find_element_by_id('ulCommentList')
        logToFile(memu.text)
        p='QZBlog.Util.PageIndexManager.goDirectPage('+str(num)+')'
        #driver.execute_script调用页面的js
        driver.execute_script(p+';return false;')
    if num==265:
        time.sleep(2)
        memu=driver.find_element_by_id('ulCommentList')
        logToFile(memu.text)

不须要直接获取每一个li标签的内容,获取外层ul的文本便可,这种方法只能获取核心文字,图片没法拷贝,下载完的样子是这样:python2.7

      拷完本身的,又去把闺蜜的留言拷了一份,她的留言比我多多了,由于她很喜欢本身去给本身留言,拷的速度仍是蛮快的,若是我不用time.sleep(延时执行)会更快,可是不用延时,有时会报错,估计是页面元素还没加载出来,获取不到。post

      下面继续说说怎么爬取说说以及说说的图片(我真是太无聊了 )

      每条说说的内容都包含在类名为“content‘的pre标签中,说说发布的时间在类名为"c_tx c_tx3 goDetail"的a标签中,因而这样获取内容:(我是百度的,哈哈,若是是我,我估计还不会用zip)

        contents = driver.find_elements_by_css_selector('.content')
        times = driver.find_elements_by_css_selector('.c_tx.c_tx3.goDetail')
        for c,t in zip(contents,times):
            data =t.text+"\n"+c.text+"\n"
            logToFile(data)

这样得出的内容是这样的:

很清晰明了,可是看着总少了那种feel。我本身想了个功能,就是把说说的图片也下载下来,本想一块儿放进word文档,可是会报错,因而放弃了,改成放到一个单独的文件夹中:

        hp=driver.find_elements_by_class_name('img-attachments-inner')
        ho=''
        for ho in hp:
            hq=ho.find_elements_by_tag_name('a')
            for tg in hq:
                try:
                    linkF=tg.get_attribute('href')
                    urllib.request.urlretrieve(linkF,'./myshuoshuo/%s.jpg' % str(x))
                    x+=1
                except:
                    logToFile('something was wrong!')

上面的代码有个地方坑苦了我,因为以前的driver.find_elements_by_css_selector方法是我直接复制网上的,此次我下载图片打成了:driver.find_element_by_css_selector,老是报错,报hp不是个可迭代的对象,调试输出也的确只输出第一个图片的内容,我就好纳闷了,查了好多,百度和谷歌都翻了,我以前一直用的都是find_element,并不知道还有个find_elements,因此当我找到一篇博客,上面很清晰明了地告诉我,应该把前者改成后者,认真对比以后我才知道是少了个”s",加上果真不报错了,也怪我本身不细心,没留意到它们之间的区别,或者说个人基础还不结实,我刚接触不久,因此值得原谅,嘻嘻。翻页是判断是否还有下一页这个跳转,有就跳到下一页,继续获取:

    try:
        driver.find_element_by_link_text('下一页')
        d = True
    except:
        d = False

当变量d为真时,点击”下一页“按钮。看着下载回来的照片却是挺有感受,哈哈。

 

要保持学习,好好努力,恩恩。

相关文章
相关标签/搜索