日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬虫——使用selenium爬取qq群的成员信息(全自动实现自动登陆)

發布時間:2023/12/10 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫——使用selenium爬取qq群的成员信息(全自动实现自动登陆) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 效果圖,其中涉及一些真名我就打碼了,還有qq號我也打碼了,見諒


2. 解析,通過訪問qq群官網并登陸

點擊傳送門

3. 分析登陸的元素,下圖一目了然,怎么獲取這個登陸元素應該都知道了

4. 代碼奉上

url = 'https://qun.qq.com/' # 構建谷歌驅動器 browser = webdriver.Chrome() # 請求url browser.get(url) # 模擬登陸,首先找到登陸的id,并點擊 browser.find_element_by_css_selector('#headerInfo p a').click()

5. 點擊之后出現這么一個框框(這個框框可把我折磨的阿)原因是這樣的,尋常的獲取這個框框是不能獲取到的

6. 先看看這個框所在的位置,這個框框竟然在另一個html代碼里面,也就是說在瀏覽器看的時候,出現了兩個html標簽,老實說,我是第一次看到這種情況的,奈何我的html也不好,連入門都算不上,沒辦法,我就去百度了,果然黃天不負有心人,說是因為iframe這個標簽可以再放html代碼,所以就是這種情況了

7. 既然知道了是怎么一回事之后,那就可以繼續操作了,首先我們先找到iframe這個標簽,然后獲取它的src屬性,這個鏈接就是這個框框登陸的鏈接了,如果不獲取這個iframe標簽的src屬性,那么我們使用selenium是獲取不到這個框框的元素的。

# 點擊之后會彈出一個登陸框,這時候我們用顯示等待來等待這個登陸框加載出來 WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#loginWin iframe')) ) print('登陸框已加載') # 登陸框加載之后,我們發現整個登陸框其實就是另一個網網頁 # 如果在原網頁操作這個登陸框的話,是不能操作的 # 所以我們只需要提取iframe標簽的src屬性,然后再去訪問這個url即可實現 # 自動登陸 # 找到iframe標簽并獲取src iframe_url = browser.find_element_by_css_selector('#loginWin iframe').get_attribute('src') # 再訪問這個url browser.get(iframe_url) # 找到快捷登陸的頭像并點擊 # 首先用顯示等待這個頭像已經加載完成 WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.ID, 'qlogin_list')) ) browser.find_element_by_css_selector('#qlogin_list a').click() print('登陸成功')

8. 登陸成功之后我們需要的是群管理,是ul標簽的第四個li標簽,通過xpath獲取

# 登陸成功之后,我們就找到群管理的標簽并點擊,首先等待這個元素加載完成 WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.XPATH, './/ul[@id="headerNav"]/li[4]')) ) browser.find_element_by_xpath('.//ul[@id="headerNav"]/li[4]').click()

9. 點擊群管理之后,進入群管理界面,我們需要的是成員管理

# 點擊之后,我們找到成員管理標簽并點擊 WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'color-tit')) ) browser.find_element_by_class_name('color-tit').click()

10. 點擊成員管理之后會重新新建一個窗口,這個時候就會出現句柄,我們需要將當然窗口的句柄切換到新打開的這個界面,不然的話,是獲取不到新打開界面的信息的,注釋已經寫了

# 打印全部窗口句柄 # print(browser.window_handles) # 打印當前窗口句柄 # print(browser.current_window_handle) # 注意這里點擊成員管理之后會自動跳轉到一個新窗口打開這個頁面 # 所以我們需要將窗口句柄切換到這個新窗口browser.switch_to.window(browser.window_handles[1])# 解釋一下browser.switch_to.window是獲取當前一共有幾個窗口 # 這里是2個 # browser.switch_to.window這個是指定當前游標切換到哪個窗口 # 其實也可以這么寫 # all_window = browser.switch_to.window返回的是一個列表 # browser.switch_to.window(all_window[1]) # 效果是一樣的

11. 我們需要的是我加入的群信息

# 切換句柄之后,我們顯示等待窗口出來WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'my-all-group')))# 篩選出我加入的群標簽lis = browser.find_elements_by_xpath('.//div[@class="my-all-group"]/ul[2]/li')

12. 遍歷列表,取出信息

# 遍歷 num= 0 while True:if num == len(lis):breaktry:# 按順序選擇群并獲取信息# 先點擊該群獲取成員信息lis[num].click()# 顯示等待信息加載完成WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'list')))# 獲取該群當前有多少人,后面翻頁需要groupMemberNum = eval(browser.find_element_by_id('groupMemberNum').text)# 每一次翻頁都會刷新21條信息,所以寫個循環# 這里加1是因為假如一個群有36人,那么count=1,如果循環的話就不會翻頁了# 也就是只能抓到一頁的數據,大家可以自己想想其中的流程就知道了count = groupMemberNum // 21 + 1# 這里我只爬取每個群的一部分,如果想爬取全部成員信息# 請注釋下面的if語句if count > 2:count = 1# 每次循環都進行翻頁# while count:# count -= 1## browser.execute_script('document.documentElement.scrollTop=100000')# time.sleep(2)time.sleep(2)# 開始獲取成員信息trs = browser.find_elements_by_class_name('mb')if trs:# 遍歷for tr in trs:tds = tr.find_elements_by_tag_name('td')[2:]if len(tds) == 8:# qq網名qq_name = tds[0].text# 群名稱group_name = tds[1].text# qq號qq_number = tds[2].text# 性別gender = tds[3].text# qq年齡qq_year = tds[4].text# 入群時間join_time = tds[5].text# 等級(積分)level = None# 最后發言時間end_time = tds[6].text# 聲明一個字典存儲數據data_dict = {}data_dict['qq_name'] = qq_namedata_dict['group_name'] = group_namedata_dict['qq_number'] = qq_numberdata_dict['gender'] = genderdata_dict['qq_year'] = qq_yeardata_dict['join_time'] = join_timedata_dict['level'] = leveldata_dict['end_time'] = end_timeprint(data_dict)elif len(tds) == 9:# qq網名qq_name = tds[0].text# 群名稱group_name = tds[1].text# qq號qq_number = tds[2].text# 性別gender = tds[3].text# qq年齡qq_year = tds[4].text# 入群時間join_time = tds[5].text# 等級(積分)level = tds[6].text# 最后發言時間end_time = tds[7].text# 聲明一個字典存儲數據data_dict = {}data_dict['qq_name'] = qq_namedata_dict['group_name'] = group_namedata_dict['qq_number'] = qq_numberdata_dict['gender'] = genderdata_dict['qq_year'] = qq_yeardata_dict['join_time'] = join_timedata_dict['level'] = leveldata_dict['end_time'] = end_timedata_list.append(data_dict)print(data_dict)browser.find_element_by_id('changeGroup').click()time.sleep(3)WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'ui-dialog')))lis = browser.find_elements_by_xpath('.//div[@class="my-all-group"]/ul[2]/li')num += 1except Exception as e:lis = browser.find_elements_by_xpath('.//div[@class="my-all-group"]/ul[2]/li')num += 1continue

13. 一些需要說明的思路,num是判斷是否爬完這些群,如果爬完了,那就退出循環


14. 因為lis是每個群,所以lis[num].click()是點擊當前的群,進入查看群成員信息

15. 最后需要注意的就是當我們爬取當前群的成員信息之后,怎么切換到下一個群


16. 完整代碼附上

# 導入需要的包 # 爬取qq群的成員信息 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import time import json import csv# 開始登陸 def login_spider():url = 'https://qun.qq.com/'# 構建谷歌驅動器browser = webdriver.Chrome()# 請求urlbrowser.get(url)# 模擬登陸,首先找到登陸的id,并點擊browser.find_element_by_css_selector('#headerInfo p a').click()# 點擊之后會彈出一個登陸框,這時候我們用顯示等待來等待這個登陸框加載出來WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#loginWin iframe')))print('登陸框已加載')# 登陸框加載之后,我們發現整個登陸框其實就是另一個網網頁# 如果在原網頁操作這個登陸框的話,是不能操作的# 所以我們只需要提取iframe標簽的src屬性,然后再去訪問這個url即可實現# 自動登陸# 找到iframe標簽并獲取是如此熟悉iframe_url = browser.find_element_by_css_selector('#loginWin iframe').get_attribute('src')# 再訪問這個urlbrowser.get(iframe_url)# 找到快捷登陸的頭像并點擊# 首先用顯示等待這個頭像已經加載完成WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.ID, 'qlogin_list')))browser.find_element_by_css_selector('#qlogin_list a').click()print('登陸成功')return browser# 切換句柄操作 def switch_spider(browser):# 登陸成功之后,我們就找到群管理的標簽并點擊,首先等待這個元素加載完成WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.XPATH, './/ul[@id="headerNav"]/li[4]')))browser.find_element_by_xpath('.//ul[@id="headerNav"]/li[4]').click()# 點擊之后,我們找到成員管理標簽并點擊WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'color-tit')))browser.find_element_by_class_name('color-tit').click()# 打印全部窗口句柄# print(browser.window_handles)# 打印當前窗口句柄# print(browser.current_window_handle)# 注意這里點擊成員管理之后會自動跳轉到一個新窗口打開這個頁面# 所以我們需要將窗口句柄切換到這個新窗口browser.switch_to.window(browser.window_handles[1])# 解釋一下browser.switch_to.window是獲取當前一共有幾個窗口# 這里是2個# browser.switch_to.window這個是指定當前游標切換到哪個窗口# 其實也可以這么寫# all_window = browser.switch_to.window返回的是一個列表# browser.switch_to.window(all_window[1])# 效果是一樣的return browser# 開始采集數據 def start_spider(browser):# 聲明一個列表存儲字典data_list = []# 切換句柄之后,我們顯示等待窗口出來WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'my-all-group')))# 篩選出我加入的群標簽lis = browser.find_elements_by_xpath('.//div[@class="my-all-group"]/ul[2]/li')# 遍歷num = 0while True:try:# 按順序選擇群并獲取信息# 先點擊該群獲取成員信息lis[num].click()# 顯示等待信息加載完成WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'list')))# 獲取該群當前有多少人,后面翻頁需要groupMemberNum = eval(browser.find_element_by_id('groupMemberNum').text)# 每一次翻頁都會刷新21條信息,所以寫個循環# 這里加1是因為假如一個群有36人,那么count=1,如果循環的話就不會翻頁了# 也就是只能抓到一頁的數據,大家可以自己想想其中的流程就知道了count = groupMemberNum // 21 + 1# 這里我只爬取每個群的一部分,如果想爬取全部成員信息# 請注釋下面的if語句if count > 5:count = 5# 每次循環都進行翻頁while count:count -= 1browser.execute_script('document.documentElement.scrollTop=100000')time.sleep(2)time.sleep(3)# 開始獲取成員信息trs = browser.find_elements_by_class_name('mb')if trs:# 遍歷for tr in trs:tds = tr.find_elements_by_tag_name('td')[2:]if len(tds) == 8:# qq網名qq_name = tds[0].text# 群名稱group_name = tds[1].text# qq號qq_number = tds[2].text# 性別gender = tds[3].text# qq年齡qq_year = tds[4].text# 入群時間join_time = tds[5].text# 等級(積分)level = None# 最后發言時間end_time = tds[6].text# 聲明一個字典存儲數據data_dict = {}data_dict['qq_name'] = qq_namedata_dict['group_name'] = group_namedata_dict['qq_number'] = qq_numberdata_dict['gender'] = genderdata_dict['qq_year'] = qq_yeardata_dict['join_time'] = join_timedata_dict['level'] = leveldata_dict['end_time'] = end_timeprint(data_dict)elif len(tds) == 9:# qq網名qq_name = tds[0].text# 群名稱group_name = tds[1].text# qq號qq_number = tds[2].text# 性別gender = tds[3].text# qq年齡qq_year = tds[4].text# 入群時間join_time = tds[5].text# 等級(積分)level = tds[6].text# 最后發言時間end_time = tds[7].text# 聲明一個字典存儲數據data_dict = {}data_dict['qq_name'] = qq_namedata_dict['group_name'] = group_namedata_dict['qq_number'] = qq_numberdata_dict['gender'] = genderdata_dict['qq_year'] = qq_yeardata_dict['join_time'] = join_timedata_dict['level'] = leveldata_dict['end_time'] = end_timedata_list.append(data_dict)print(data_dict)browser.find_element_by_id('changeGroup').click()time.sleep(3)WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'ui-dialog')))lis = browser.find_elements_by_xpath('.//div[@class="my-all-group"]/ul[2]/li')num += 1except Exception as e:continuereturn data_listdef main():browser = login_spider()browser = switch_spider(browser)data_list = start_spider(browser)# 將數據寫入json文件with open('data_json.json', 'a+', encoding='utf-8') as f:json.dump(data_list, f)print('json文件寫入完成')# 這里的編碼格式不要寫錯了,不然會出現亂碼,因為群里面的大神名字賊騷with open('data_csv.csv', 'w', encoding='utf-8-sig', newline='') as f:# 表頭title = data_list[0].keys()# 聲明writerwriter = csv.DictWriter(f, title)# 寫入表頭writer.writeheader()# 批量寫入數據writer.writerows(data_list)print('csv文件寫入完成')if __name__ == '__main__':main()

總結

以上是生活随笔為你收集整理的python爬虫——使用selenium爬取qq群的成员信息(全自动实现自动登陆)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。