python selenium爬取QQ空间说说_ReScale的博客-程序员ITS301

技术标签: 爬虫  python  python爬虫  

准备工作

安装selenium, pyquery, json模块。
使用的是火狐浏览器,所以还要安装geckodriver, 下载好后,把geckodirver.exe文件放在python.exe同一文件夹下即可。
如果使用chrome浏览器,需要安装chromedriver,需要对应好版本号,否则运行不起来。把下载后的chromedriver.exe放在python的Scripts文件夹下即可。
本次爬取使用火狐浏览器。

爬取步骤

爬虫最重要的一步就是如何获取到网页源代码,对于现在各种各样的动态网页,有时候可以使用Ajax请求直接获取到数据,但是大多数时候Ajax请求中的参数繁多也难以确定规律,所以本次使用selenium来获取网页的源代码,所见即所爬。

1、获取网页源码

首先确定我们需要访问的网页网址。
在这里插入图片描述
中间的部分就是你想要爬取的QQ号。这里解释下后面的main为主页。将main换成了其他的一些数字,例如311,334等等,这些可以直接访问到说说,留言版等等,感兴趣的可以直接访问说说界面开始爬取信息,这里不做考虑,还是直接从主页开始一步步访问说说。
这里放一张图片,为什么是311可以直接访问到说说。(右键检查(查看元素)或者F12进入)
在这里插入图片描述
在进入空间主页后,我们接下来需要确定“说说”按钮,有两个说说按钮,获取其中一个就行。(详细代码后面再放)

btn_ss = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#QM_Profile_Mood_A span')))
btn_ss.click()

等待按钮可点击后,点击按钮,网页即跳转到说说界面。这里有个坑,如果这时候你直接获取网页源代码是获取不全的。
在这里插入图片描述
如果你没有从头分析网页结构,你肯定会忽略掉这个iframe标签,然后一直尝试获取网页源代码,但就是发现获取不到你想要的说说数据在哪。(卡了可能有一个小时,才想起来可能有iframe标签,o(╥﹏╥)o哭了)
如果不知道iframe标签的作用的话,这里简单介绍一下,如果你获取的网页中含有iframe或者frame标签,则你将获取不到这些标签里面的数据,必须使用switch_to.frame()方法切换frame,同样的在子frame中也是获取不到父frame中的数据。

browser.switch_to.frame('app_canvas_frame')

这里将browser切换frame,填入的参数为iframe的id即可成功切换。切换好数据后就可以成功的爬取数据了。
这里page可以先忽略,用来分页爬取时使用。

browser = webdriver.Firefox()
wait = WebDriverWait(browser, 10)


def index_page(qq, page):
    #  进入主页
    try:
        url = 'https://user.qzone.qq.com/' + qq
        browser.get(url)
        btn_ss = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#QM_Profile_Mood_A span')))
        btn_ss.click()
        browser.switch_to.frame('app_canvas_frame')
        if page > 1:
            print('正在爬取', page, '页')
            input = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '#pager .textinput')))
            submit = wait.until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, '#pager .bt_tx2')))
            input.clear()
            input.send_keys(page)
            submit.click()
        get_info()
    except TimeoutException:
        index_page(qq, page)

2、解析网页源码

在获取网页源码前,最好先等待几秒,不然可能在切换frame后,仍然获取不到其中的数据。
在这里插入图片描述
所有的说说都是在ol这个便签下,ol便签下的一个li标签对应一条说说,同时我们发现每个li标签都有feed属性。
所以第一步我们先获取到这些li标签,这里使用css选择器来获取到ol下所有的li标签。

items = doc('#msgList .feed').items()

如果对css选择器不熟悉的朋友,我这里再稍微解释一下,#号后面跟着的是id,.号后面跟着的是属性,如果像直接获取到标签就直接使用li, ol即可。,css选择器可以嵌套多个属性,标签等等。
获取到li标签后,我们再来解析li标签的结构。
在这里插入图片描述
第一个div是用户的头像,第二个div才是我们需要的说说主体,第三个div没啥用。
在这里插入图片描述
接下来就是定位说说的文字,图片,时间,转发评论数分别属于哪个部分,再通过css选择器选定标签,获取其中的信息。

def get_info():
    time.sleep(3)
    html = browser.page_source
    # print(html)
    doc = pq(html)
    items = doc('#msgList .feed').items()
    for item in items:
        pic = []
        images = item.find('.md img').items()
        for image in images:
            pic.append(image.attr('data-src'))
        ss = {
            'author': item.find('.bd .qz_311_author').text(),
            'content': item.find('.bd .content').text(),
            'image': pic,
            'time': item.find('.ft .info').text()
        }
        save_to_txt(ss)

3、写入文件

写入文件没什么好介绍的,这里使用json,直接写入的是txt,可以选择存放在数据库中,或者csv文件。

def save_to_txt(ss):
    with open('data.txt', 'a', encoding='gb18030') as file:
        file.write(json.dumps(ss, ensure_ascii=False) + '\n')

4、分页爬取

MAX_PAGE = 17

if __name__ == '__main__':
    for page in range(1, MAX_PAGE + 1):
        index_page('qq号', page)

分页爬取时,需要先提前确定爬取的最大页数。

if page > 1:
    print('正在爬取', page, '页')
    input = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#pager .textinput')))
    submit = wait.until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, '#pager .bt_tx2')))
    input.clear()
    input.send_keys(page)
    submit.click()

回到之前的if语句,这里是获取的是一个文本框与按钮。
在这里插入图片描述
判断在爬取到第二页的时候,因为我们一直都是访问第一页的说说,所以在解析前,需要进行跳转网页。如果使用下一页跳转的话,那比如在第十页跳转出错时,就无法直接从第十一页开始继续获取数据。

再强调一次,一定要记得切换frame,否则将无法获取到这些文本框,按钮,导致无法进行跳转!!!

说在最后的话

第一点:不要忘记切换frame
第二点:不要频繁尝试爬取一个人,因为可能被检测到,导致出现下面的提示。
在这里插入图片描述
别问我怎么知道的,ヾ(⌐ ■_■)。虽然出现这个并不影响继续爬虫,但是还是很难过啊,一般过几个小时候,就会自动解了。
第三点:爬取的时候可能会报错,解决办法就是once again,重新运行。还有就是在你觉得可能错误的地方,sleep一下,等待网页响应,因为可能你需要的控件没有加载出来。(可是我都wait了,为什么有时候没有跳转到说说界面,直接运行switch语句,不要问我,我也不知道orz…)
第四点:当你运行程序,弹出网页的时候,需要你登录,这时候你可以选择手动登录或者python 模拟登录。但是,模拟登录多了,也就是几次之后,就会出现验证码,要模拟验证这又是另一回事了。所以这里推荐还是手动登录,稳妥。又一个但是,如果你想要无界面爬取,就是使用PhantomJS的话,就必须模拟登录,并且需要判断是否需要进行验证,两个字:麻烦。模拟登录的代码,我注释了在总代码中,想要试试的朋友,直接将注释去掉即可。
第五点:你或许想爬那些需要访问授权的好友空间,我这里郑重告诉你,或许别人的代码可行,但是我的代码是不可以的。(因为没去考虑啊,干)
第五点:(这人话好多啊(╯‵□′)╯︵┻━┻)代码在这,差点忘了。https://github.com/DRNTT/Spider/blob/master/练习/kongjian.py

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Reserve_Scale/article/details/90181751

智能推荐

uni-app的学习_Dheroo的博客-程序员ITS301

什么是uni-app是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台。为什么要用uni-app开发(优势)在开发者数量、案例、跨端抹平度、扩展灵活性、性能体验、周边生态、学习成本、开发成本等8大关键指标上拥有更强的优势。uni-app的功能框架un...

cuckoo布谷鸟沙箱安装与布置使用_xiaomingdexiaoshubao的博客-程序员ITS301

环境以及安装前的注意事项不提供本次实现所涉及分析的木马本次安装所需要构造的所有的环境的大体图物理机(windows)如果你的物理机装的是Ubuntu或者其他debian系统那就更好了,安装步骤会更快虚拟机管理软件(安装在你的物理机上的)推荐:VMware、virtualbox(不推荐)虚拟机里的虚拟机Ubuntu 16.04.4,16.04.6 (这两个版本...

Android M的App Links实现详解_赤耳A狼的博客-程序员ITS301_android app-link 标签

谷歌2015年的I/O大会上宣布了一个 新特性 (http://www.androidpolice.com/2015/05/28/io-2015-android-m-will-support-app-deep-linking-without-that-annoying-selector-prompt/):允许开发者将app和他们的web域名关联。这一举措是为了最小化用户遇到“打开方式”对话框的概率

绘制contour图报错TypeError: clabel() got an unexpected keyword argument ‘contour_label_fontsize’_然而raner.的博客-程序员ITS301

绘制contour图报错TypeError: clabel() got an unexpected keyword argument ‘contour_label_fontsize’在绘制部分依赖图的contour图时出现了以上报错,搜索了一下似乎很多人都遇到了这个问题。尝试打开函数查看时发现可能是定义问题,于是做出了如下修改。问题解决。(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9y...

苹果手机技巧,如何查男朋友手机,查岗技能大曝光!_奈奈酱2020的博客-程序员ITS301

情侣之间都是需要互相信件的条件下感情才能走得长远,但是作为一个女人的好奇心驱使着你去查看男朋友的手机。不过,常言道,身正不怕影子邪,男同胞们,你敢接受女朋友的查岗技能吗?下面我来介绍的一下怎么操作这个技能,前提是你的男朋友必须是苹果手机,那样就可以查找他曾经过去的地方。首先打开男朋友的手机设置-隐私-定位服务。然后再打开系统服务-下拉到重要地点-这时会出现一个设置的触控ID的指纹,你能...

【FTP工具类】提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作_gamedev˚的博客-程序员ITS301

介绍:FTP工具类,提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作。应用场景: 通过FTP连接需要获取文件目录列表 通过FTP连接读取指定文件内容 递归读取遍历服务器上所有文件 其他功能点...可以在留言处提需求给我package com.nkm.deploy.common.utils;import java.io.BufferedReader;import ...

随便推点

FPGA的可编程技术_徐晓康的博客的博客-程序员ITS301_fpga编程

FPGA的可编程技术,包括熔丝,反熔丝,FLASH,SRAM等

Uncaught SyntaxError: Invalid regular expression: /^(?:[-()\/a-zA-Z0-9ã‚: Range out of order in char_叫什么名字好了的博客-程序员ITS301

错误:Uncaught SyntaxError: Invalid regular expression:/^(?:[-()\/a-zA-Z0-9ã‚¡-ヺー-ヾヲ-゚ーï¼-ï¼ï¼¡-Zï½-zã-ã‚–ã‚-ゞー々ã-ã‚“ã‚¡-ヾ一-\u9FEFã€-䶵﨎ï¨ï¨‘﨓﨔﨟﨡﨣﨤﨧-ï¨]|[\ud...

【Leetcode每日一题】621. 任务调度器(排序 可用堆/优先队列进行优化)_YancyKahn的博客-程序员ITS301_任务调度器 优先队列

Leetcode 每日一题题目链接: 621. 任务调度器难度: 中等解题思路: 对任务按照出现的次数进行排序,然后每次从出现次数最多的数开始,向后取n个,不够n的话补齐。 这个排序过程可以用堆或者是优先队列进行优化。本文未作优化。题解:class Solution: def leastInterval(self, tasks: List[str], n: int) -> int: # 对任务按照出现的次数进行排序 ntasks = collectio

linux0.11启动时bootsect.s和setup.s的主要作用_apkjdk的博客-程序员ITS301

cpu启动时为实模式,此时硬烧录的将cs=0xFFFF,ip=0x0,并自动开始执行0xFFFF0(ROM-BIOS的地址)的代码,BIOS会自检,并在0x0地址处设置中断向量表,此后实模式的int中断全部依赖此表,并将0磁道0扇区的512字节(引导扇区,放bootsect.s)读入内存0x7c000处,并跳转到此地址.bootsect.s只能占512字节,功能有限,所以需要setup.s, 首先bootsect.s将自身从0x7c000移动到0x90000(为setup.s将system移动到0x00

基于CRNN+CTC的改进图像文本识别算法_AstheHollowman的博客-程序员ITS301_crnn改进

上一次介绍了基于改进EAST(An Efficient and Accurate Scene Text Detector)算法的文本定位算法这次我来介绍基于卷积循环神经网络CRNN (Convolutional Recurrent Neural Network)的图像文本的识别算法进行研究。我们首先来看是利用PaddlePaddle实现的CRNN文字识别。以下是摘取了部分代码(CRNN网络模型)。# CRNN网络模型#################### 自己写的代码这里开始 ##########

推荐文章

热门文章

相关标签