列表说说
可能网速有点卡
在空间最上方,右边(退出旁边)有个齿轮状的东西,空间设置,同步设置!自己空间里有个设置,同步更新到别人空间,或只更新到指定等。现在不方便,如果你自己找不到,我晚上登空间给你具体方法!
你好。
以表格为容器,装载着文字或图表的一种形式,叫列表。
前几天刚刚爬完了一百多个好友的总计5万条说说,说一下自己的思路。QQ空间的空间动态都是由JavaScript控制的(电脑和手机触屏版皆是如此),自己便选择了Selenium作为对数据获取的工具。总的工具:Python+Selenium+Firefox+MongoDB总的过程为:1、从QQ邮箱中获取好友QQ号;2、访问好友QQ空间的说说分页;3、访问并获取说说数据;最开始想的是从QQ空间的个人中心的好友动态中逐条获取好友的动态,但折腾了很久发现,无论是电脑版还是触屏版,都有一个下翻加载,再是点击加载的Ajax,能力低下,百度谷歌了各种方法,皆无法下拉加载数据。此路只好作罢。后来从一篇《使用Python模拟登录QQ邮箱获取QQ好友列表》的文章中想到,先获取好友的QQ号,然后再把QQ号填充到QQ空间的URL中,对好友QQ空间进行访问。1、从QQ邮箱中获取好友QQ号QQ邮箱的通讯录中有一个导出通讯录的功能,可以选择CSV格式,方便使用Python进行读取操作。打开之后是这个样子的(一小部分):处理之后放入列表之中就成这样了:然后,进行正题:分析QQ空间的网页可知:1、好友QQ空间的说说页面URL为:http://user.qzone.qq.com/{QQ号}/3112、说说列表的分页亦由javascript控制:3、正常访问的页面存在id为'QM_OwnerInfo_Icon'的元素;4、说说的内容存在于另一个iframe中;所以,爬取说说的主体部分为:1、GET空间说说页面的URL:driver.get('http://user.qzone.qq.com/{}/311'.format(qq)) 2、判断页面中是否存在登录框,如果存在则执行登录操作:try: driver.find_element_by_id('login_div') a = True except: a = False if a == True: driver.switch_to.frame('login_frame') driver.find_element_by_id('switcher_plogin').click() driver.find_element_by_id('u').clear()#选择用户名框 driver.find_element_by_id('u').send_keys({QQ号}) driver.find_element_by_id('p').clear() driver.find_element_by_id('p').send_keys({QQ密码}) driver.find_element_by_id('login_button').click() 2、在登录QQ空间,进入好友空间后,判断其是否可访问,如果可访问,则爬取第一页并写入数据库(有些拒绝访问或是要求回答问题,在此只爬取能够访问到的空间说说):try: driver.find_element_by_id('QM_OwnerInfo_Icon') b = True except: b = False if b == True: driver.switch_to.frame('app_canvas_frame') content = driver.find_elements_by_css_selector('.content') stime = driver.find_elements_by_css_selector('.c_tx.c_tx3.goDetail') for con,sti in zip(content,stime): data = { 'qq':qq, 'time':sti.text, 'shuos':con.text } print(data) qzone_shuos.insert_one(data) 3、有些好友说说发表的少,只有第一页的内容,所以判断页面是否有第二页的内容,如果有,继续爬取:try: driver.find_element_by_link_text('下一页') d = True except: d = False if b == True: 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): datas = { 'qq':qq, 'time':t.text, 'shuos':c.text } print(datas) qzone_shuos.insert_one(datas) 4、使用多线程或多进程或循环或遍历,把QQ号列表中的QQ作为参数填充到爬取的主函数中。使用多进程模块multiprocessing的Pool类老是在第一个QQ号爬取完之后报错,折腾不来,又有大把的时间,索性直接for循环遍历了。最后对爬取的数据进行了一些简单的处理和统计:今年七个月每月的说说发表量今年七个月说说发表量前20嗯,代码挺渣的,将就着看吧= =!!!