dgbb

title: python + selenium +chrome爬取qq空间好友说说并存入mongodb数据库

准备阶段

在正式开始在前需要先准备好做爬虫的工具,本例使用chrome无头浏览器进行爬取工作,也可使用其他浏览器,程序中的其他可替代工具在此之后不再一一赘述,有一些不明白的地方可以自行百度,有错误的地方欢迎大家指正,大家共同学习共同进步!!

需要用到的库:

pymongo
selenium
csv
time

爬虫思路分析

从csv文件读取好友qq号码构造url链接
使用chrome + selenium登录QQ,选择账号密码的等率方式
爬取好友说说的发表的时间信息
把爬取到的信息存储在mongodb中

从qq邮箱获取好友列表,存储为csv文件

打开qq邮箱选择通讯录 > 工具 > 导出联系人文件选择部分好友文件导出,保存为csv文件,之后便于从csv文件读取好友qq号

qq空间好友说说的链接为http://user.qzone.qq.com/{好友qq号码}/311,首次打开需登录

观察源码,选择适当的筛选方法

写入数据库

爬虫代码如下:


    #导入程序需要的库
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import time
    import csv
    import pymongo
    
    #链接数据库
    client = pymongo.MongoClient(\'localhost\',27017)
    #创建数据库和数据集合
    net_speader = client[\'net_speader\']
    qq_data = net_speader[\'qq_data\']

    chrome_options = Options()
    #选择无头chrome,并设置窗口最大化
    chrome_options.add_argument(\'--headless\')
    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.maximize_window()
    
    #定义获取信息的函数
    def get_info(qq):
        #声明变量
        global time
        #请求url隐式等待15s
        driver.get(\'https://user.qzone.qq.com/{}/311\'.format(qq))
        driver.implicitly_wait(15)
        #判断页面是否需要登陆,通过查找是否有ID为login_div的div标签来进行判断
        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()
            time.sleep(5)
        driver.implicitly_wait(3)
        #通过查找是否有ID为QM_OwnerInfo_Icon的div标签来判断是否有权限访问好友的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\')
            contents = driver.find_elements_by_css_selector(\'.content\')
            times = driver.find_elements_by_css_selector(\'.c_tx.c_tx3.goDetail\')
            for content,time in zip(contents,times):
                data = {
                    \'time\':time.text,
                    \'content\':content.text
                }
                print(data)
                qq_data.insert_one(data)
    #主程序入口,通过csv库读取通讯录文件,存入列表
    if __name__ == \'__main__\':
        qq_lists = []
        fp = open(r\'W:\text\qqmail.csv\',encoding=\'gb18030\',errors=\'ignore\')
        reader = csv.DictReader(fp)
        for row in reader:
            qq_lists.append(row[\'qqmail\'].split(\'@\')[0])

        fp.close()
        print(qq_lists)
        for i in qq_lists:
            get_info(i)

分类:

技术点:

相关文章: