2023最新详细:使用selenium携带cookie登录QQ空间,爬取指定好友空间说说照片

写在前面:最近学了爬虫,正好爬取一下指定好友的所有空间说说照片,之前使用selenium账号密码登录,模拟登录次数过多,会加验证码,甚至导致QQ冻结,所以采用cookie登录


思路

首先获取cookie,使用cookie登陆之后通过空间好友栏搜索指定好友,并进入好友空间,从而爬取说说照片,注意说说分纯文字,(文字+)图片,(文字+)链接,(文字+)视频,因为首次默认加载空间说说数量限制,通过模拟屏幕滑动加载所有说说,再通过xpath定位处理,解析出图片src,进而下载持久化存储。

导入所需包

from selenium import webdriver
from time import sleep
from lxml import etree
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import os
import requests
import re
import json

登录QQ空间

1.获取cookie

安装Google插件EditThisCookie

 导出cookie

拿到cookie,节选如下,要修改一下cookie 

{
    "domain": ".qzone.qq.com", #均修改为 "domain": ".qq.com",不然出现域名不匹配问题
    "hostOnly": false,
    "httpOnly": false,
    "name": "zzpaneluin",
    "path": "/",
    #  "sameSite": "unspecified", 注释这行方式或者设置属性值为None
    "secure": false,
    "session": true,
    "storeId": "0",
    "value": "",
    "id": 19
},


 2.携带cookie登录
url = 'https://qzone.qq.com/'
search_name = input('请输入好友姓名')
# 粘贴通过EditThisCookie获取的页面cookie信息
cookies = [ ]
chrome_options = Options()
# 不显示页面
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu')
# 反自动检测
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 创建一个Service对象,指定ChromeDriver的路径
service = Service('E:/appData/webCrawlerStu/C7.selenium/chromedriver.exe')
# 通过Service对象来初始化Chrome WebDriver
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.get(url)
sleep(3)

# 通过add_cookie方法添加cookie
for cookie in cookies:
    driver.add_cookie(cookie)

sleep(3)
driver.refresh()    # 刷新页面验证是否登录成功

进入好友空间

# 获取所有窗口句柄。句柄的顺序:先出现的先加入列表。最后出现的,最后加入列表。
wins = driver.window_handles
# 切换到最新打开的窗口
driver.switch_to.window(wins[-1])
driver.maximize_window()
# 进入好友空间
driver.implicitly_wait(5)  # 隐示等待,为了等待充分加载好网址,全局的
driver.find_element('id', 'tab_menu_care').click()
driver.find_element('id', 'aMyFriends').click()
driver.find_element('id', 'friend_search_input').send_keys(search_name)
driver.find_element('xpath', '//*[@id="friends-drop-down"]/div[2]/div/div/div[1]/div[1]/button').click()
driver.find_element('xpath', '//*[@id="search_friend_result"]/li/a').click()

wins = driver.window_handles
driver.switch_to.window(wins[-1])
# 点击我知道了
driver.find_element('xpath', '//*[@id="friendship_promote_layer"]/table/tbody/tr[1]/td[2]/a').click()

 滚动屏幕加载所有说说

def scroll_to_bottom(driver):
    # 设置初始滚动位置
    scroll_position = 0
    # 不断向下滑动直到见底
    while True:
        # 向下滚动一屏的高度
        driver.execute_script(
            f"window.scrollTo(0, {scroll_position + driver.execute_script('return window.innerHeight;')});")

        # 等待一段时间,让页面加载
        sleep(1.5)  # 可以根据实际情况调整等待时间
        # 更新滚动位置
        new_scroll_position = driver.execute_script("return window.pageYOffset;")
        if new_scroll_position == scroll_position:
            # 如果滚动位置没有发生变化,说明已经到达底部,退出循环
            break
        # 更新滚动位置
        scroll_position = new_scroll_position

scroll_to_bottom(driver)
print('屏幕滑动到底!')

说说数据解析获取图片src

# 转化到iframe
driver.switch_to.frame('QM_Feeds_Iframe')
with open('./porfile.html', 'w', encoding='utf-8') as fp:
    fp.write(driver.page_source)
sleep(5)

# 获取说说图片链接
imgsDownloadList = []
tree = etree.HTML(driver.page_source)
lis = tree.xpath('//ul[@id="host_home_feeds"]/li')
for li in lis:
    # 去除多余空格
    date = li.xpath('./div[1]/div[@class="user-info"]/div[@class="info-detail"]/span/text()')[0]
    post_date = re.sub(r"\s+", "", date).replace(':', '时') + '秒'
    a_list = li.xpath('./div[2]/div[1]/div[2]/div[1]/div[1]//a')
    # 防止纯文本
    if not a_list:
        continue
    for ref, a in enumerate(a_list, start=1):
        # 因为说说视频和图片a标下img标
        # 纯文字,(文字+) 视频 , (文字+) 图片
        img_src_list = a.xpath('.//img/@src')
        if img_src_list:
            img_src = img_src_list[0]
        else:
            # 说说类型为分享链接 ,处理找不到元素的情况
            continue
        img_name = f"{post_date}_{ref}.jpg"
        img_profile = {
            'img_name': img_name,
            'img_src': img_src
        }
        imgsDownloadList.append(img_profile)

持久化存储

# 持久化存储包含字典对象的列表
my_list = [{"name": "John", "age": 30}, {"name": "Alice", "age": 25}]
with open("./data.json", "w") as fp:
    json.dump(imgsDownloadList, fp)

# 持久化存储
# UA伪装
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
}

location = './QzoneOf' + search_name
if not os.path.exists(location):
    os.mkdir(location)

for image in imgsDownloadList:
    source = requests.get(url=image['img_src'], headers=headers).content
    filename = location + '/' +  image['img_name']
    with open(filename, 'wb') as fp:
        fp.write(source)

sleep(2)
driver.quit()

ps:图片名称以时间+序列号命名,最后还可以使用线程池处理下载图片,如有问题希望指正...

### 使用 Selenium 实现 QQ 空间自动化登录并抓取数据 #### 准备工作 为了实现这一目标,需先确认环境配置完成。确保已经安装了必要的依赖包如 `selenium` 和对应的浏览器驱动程序,例如 ChromeDriver 或 GeckoDriver。 对于QQ空间这类网站,由于其安全机制较为严格,通常会采用滑动验证码或其他形式的人机验证措施来防止自动化工具直接访问。这增加了使用标准Selenium WebDriver进行无干扰操作的难度[^1]。 #### 安全声明 值得注意的是,在未经许可的情况下尝试绕过站点的安全防护措施可能违反服务条款甚至触犯法律,请务必遵循合法合规的原则开展任何网络活动。 #### 示例代码框架 尽管直接提供完整的QQ空间登录与数据抓取存在挑战,下面给出一个简化版的概念证明型代码片段作为参考: ```python from selenium import webdriver import time # 初始化WebDriver实例, 这里假设使用Chrome浏览器 options = webdriver.ChromeOptions() driver = webdriver.Chrome(options=options) try: driver.get('https://qzone.qq.com') # 访问QQ空间首页 # 切换到登录框所在的iframe login_frame = driver.find_element_by_tag_name("iframe") driver.switch_to.frame(login_frame) # 找到账号密码输入框和登录按钮(具体选择器需要根据实际情况调整) username_input = driver.find_element_by_id('u') password_input = driver.find_element_by_id('p') submit_button = driver.find_element_by_id('login_button') # 输入用户名和密码(这里仅为示例) username_input.send_keys('your_qq_number') password_input.send_keys('your_password') # 提交表单 submit_button.click() # 等待页面加载完毕 time.sleep(5) finally: # 关闭浏览器窗口 driver.quit() ``` 此段代码仅展示了基本流程,并未处理可能出现的各种异常情况,特别是针对现代web应用中的动态元素定位、异步加载等问题。此外,考虑到QQ空间可能会有额外的身份验证环节,这段代码很可能无法成功执行整个过程[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raina Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值