在linux中使用Docker容器中的Chrome进行Twitter爬虫开发

由于twitter不能使用api来获取信息了,目前也只能使用selenium实现了。自己参考了几篇文章,写着玩的,整体思路都一样的。一切的前提是拥有Twitter账号且能够访问twitter。

成功爬取:

在linux中使用Docker容器中的Chrome进行Twitter爬虫开发_第1张图片

1、运行Docker容器

首先,我们得确保服务器已经安装了docker,然后运行如下的命令启动selenium/standalone-chrome镜像,使用docker的好处是什么都配置好了,省去了自己单独配置的时间

刚开始的时候我没有使用sudo,报了权限错误,使用sudo将在不更改用户权限的情况下,临时获得所需的权限:

sudo docker run -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome

-p 4444:4444:将容器的 4444 端口映射到服务器的 4444 端口,用于 Selenium WebDriver 连接。
--shm-size=2g:增加共享内存,减少 Chrome 崩溃的可能性。


检查是否运行了Chrome容器,如果有chrome容器信息显示出来就是正常运行了:

sudo docker ps

连接到 Docker 容器中的 Chrome WebDriver的代码

driver = webdriver.Remote(
        command_executor="http://localhost:4444/wd/hub",
        options=chrome_options
    )

2、关于数据存储

关于数据存储:由于我之前已经创建好了mysql数据库,所以我在获取了数据后直接存储到数据库了,而且我只需要‘发布时间’、‘发布内容’、‘发布链接’、‘发布者’,其它的比如‘转发数’、‘评论数’我都没用,想用的可以直接拿去使用

3、注意事项

之前一直在Windows上测试,由于Windows和Linux上浏览器语言不同,所以在获取自动登录的节点元素的时候会存在语言的差异,比如在Windows上要使用“登录”但是在Linux上要使用‘Log in’。

我代码中查看每个用户的twitter时只模拟滑动5次,因此只能获取最近的几条twitter信息,并不能获取全部的信息。

一般登录以后不要再退出浏览器了(即执行driver.quit()),否则频繁登录会有额外的安全验证步骤,代码可就用不了了。一分钟之内最好不要超过两次登录。注意频率,小心被封。

4、完整源码(Linux)

下面是linux的,想要windows的可以自己改一下。

import os
import time
import random
import logging
import sys
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from webdriver_manager.chrome import ChromeDriverManager
from datetime import datetime, timedelta
import pymysql
pymysql.install_as_MySQLdb()
import hashlib, binascii
import hashlib
import pickle

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', stream=sys.stdout)
logger = logging.getLogger(__name__)

# 确保日志输出使用 UTF-8 编码
if sys.stdout.encoding != 'UTF-8':
    sys.stdout.reconfigure(encoding='UTF-8')

# 保存 cookies
def save_cookies(driver, cookies_file='cookies.pkl'):
    cookies = driver.get_cookies()
    with open(cookies_file, 'wb') as f:
        pickle.dump(cookies, f)

# 加载 cookies
def load_cookies(driver, cookies_file='cookies.pkl'):
    if os.path.exists(cookies_file):
        with open(cookies_file, 'rb') as f:
            cookies = pickle.load(f)
            for cookie in cookies:
                driv

你可能感兴趣的:(工程实践,docker,chrome,爬虫,twitter)