纪录一下写豆瓣爬虫的过程和一些心得

selenium 的介绍

selenium 是一款自动化测试利器,可以自动化模拟人的浏览器操作行为,所以也可以用于网络爬虫。
不过这里主要讲一讲怎样用selenium来模拟登录,并持久化cookie,然后用requests爬取页面。

selenium 的安装及配置

安装

直接安装 selenium

pip install selenium

配置 webdriver

使用 selenium 前我们首先要配置浏览器的 webdriver 这边主要提供3种常用浏览器的配置页面:

⚠️ 下载前一定要查看一下自己浏览器的版本,下载适配版本的 webdriver

配置 chromedriver(Mac版本)

以chromedriver为例,在下载好后,我们将 chromedriver 档案放入到:/usr/local/bin/ 这个路径下面。

具体的步骤:打开一个 Finder -> shift+command+G -> 输入路径 /usr/local/bin/ 按下return -> 将 chromedriver 放入

⚠️ 可能会遇到的error:

“chromedriver” cannot be opened because the developer cannot be verified. Unable to launch the chrome browser on Mac OS

解决办法可以看这个Blog按照上面的步骤输入就可以正常运行了。

selenium 的一些基本用法

控制浏览器

1
2
from selenium import webdriver
driver = webdriver.Chrome() # 需要调用对应的chromedriver.exe

使用IP代理,通常不需要都行

1
2
chrome_option = webdriver.ChromeOptions()
chrome_option.add_argument('--proxy--server=112.84.55.122:9999')#使用代理IP

等待网页加载

1
driver.implicitly_wait(5) #最长等待5秒,记载完成后自动跳过

打开网页

1
driver.get(url) # 需要打开的网页

点击网页节点

1
driver.find_element_by_xpath('这里放网页xpath路径').click()

输入内容

1
driver.find_element_by_xpath('这里放网页输入框的xpath路径').send_keys('输入词')

获取文本

1
driver.find_element_by_xpath('网页中文本xpath路径').text #直接获取某个具体文本

网页下拉

1
2
js="var q=document.documentElement.scrollTop=10000000" #滚动条,数值为每次下拉的长度,不叠加,以浏览器底部为最大值
driver.execute_script(js)#调用js

使用 selenium 模拟豆瓣登录的 demo

因为selenium是模拟人的一个登录的行为,所以首先要厘清一下我们在做登录时的一个逻辑:

  1. 打开浏览器
  2. 打开url
  3. 在“短信登录”和“密码登录”中选择“密码登录”(因为短信登录会有经常报错的问题)
  4. 定位到“帐号”和“密码”(查看wed的html文档)
  5. 输入“帐号”和“密码”
  6. 点击“登录豆瓣”

需要import的模块主要就是两个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from selenium import webdriver
import time

# 接下来就是定义登录的函数
def login(self):
'''
登录,并持久化cookie
:return: None
'''
# 豆瓣登录页面 URL
login_url = 'https://www.douban.com/accounts/login'

# 获取chrome的配置
opt = webdriver.ChromeOptions()

# 在运行的时候不弹出浏览器窗口
if self.headless:
opt.set_headless()

# 获取driver对象
self.driver = webdriver.Chrome(chrome_options = opt)

# 打开登录页面
self.driver.get(login_url)

print('[login] opened login page...')

# 向浏览器发送用户名、密码,并点击登录按钮
# 首先点击“密码登录”,从手机号登陆转到密码登录(因为手机号会区域登陆异常的问题)
self.driver.find_element_by_class_name('account-tab-account').click()
# 用 clear()清空一下之前的用户名和密码,然后用 send_keys()发送一下用户名和密码
self.driver.find_element_by_name('username').clear()
self.driver.find_element_by_name('username').send_keys(self.user_name)
self.driver.find_element_by_name('password').clear()
self.driver.find_element_by_name('password').send_keys(self.password)

# 多次登录需要输入验证码,这里给一个手工输入验证码的时间
# 等待 3 秒钟
time.sleep(3)

# 定位到“登录按钮”超链接信息上面的文本元素
self.driver.find_element_by_link_text('登录豆瓣').click()
print('[login] submited...')

# 等待 3 秒钟
time.sleep(3)

# 推出 自动关闭
driver.quit()

👆就完成了一个简单的用户登入的行为