Python爬虫的Selenium小应用

814 阅读5分钟

前言

一个课程作业让爬下学校论坛版面,于是从来没有接触过爬虫的我,开始疯狂查寻资料,最终选了使用Python爬虫和Selenium库。这篇文章只是记录下我自己的学习心得。

Selenium与driver的安装

每次我和我的同学们最讨厌的就是安装和环境配置,因为出错的地方你永远都找不到kkk

1 Python安装:首先你要有个Python,Python3.0版本以上就可以(因为有pip功能,安装的时候记得勾选),然后安装和环境配置好。(有问题见后记1)

2 Selenium安装:Windows系统下,在命令行里输入

pip intstall selenium

安装完成或者已经安装过都会在下面显示。

3 driver安装:选用一个你有的浏览器,这里推荐chrome,代码量少,当然也可以选择Firefox。 接下来下载相对应的driver,我选择的是chrome,下面都用chrome来举例。

首先查询一下自己的chrome版本,点击chrome右上角(竖着的三个点),选择帮助->关于Google Chrome,点开就能看到。

这里提供chromedriver的下载地址:

1.chromedriver.storage.googleapis.com/index.html

2.npm.taobao.org/mirrors/chr…

如果chrome更新到最新版本,拿着版本号去和比对就可以了,点开下载对应的压缩包就可以。如果是比较老的版本,上面没有显示,从2.46往前寻找,点开之后查notes.txt里面有写对应chrome的版本号。

下载完成后,接下来环境变量配置。把chromedriver.exe放置在chrome的文档下,一般默认是这个路径C:\Program Files(x86)\Google\Chrome\Application,如果自定义过,就按照自己设定的找一找。然后把chromedriver.exe所在的路径,在控制面板->系统和安全->系统->高级系统设置->高级->环境变量,在下面的系统变量中寻找变量为Path的,编辑->新建,将所在路径粘贴进去。

打开Pycharm,用这段代码测试一下,如果可以看到弹出的页面,说明安装和配置成功!接下来进入正题。

from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")

访问页面

from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
print(browser.page_source)
browser.close()

这个可以将这个页面的信息爬取下来,而且自动关闭页面。但是信息是一行,非常难看清楚,而且关闭页面其实会使我们看不到最后的页面状态,建议调试的时候先将这行注释掉。

查找元素

只介绍两种最常用的,我也只用到了这两种:

input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_xpath('//*[@id="q"]')

第一种是通过寻找id,第二种是xpath,都是查找单个元素,下面的是查找多个元素,下面会有应用到。

lis = browser.find_elements_by_xpath('//*[@id="q"]')

账户登录

因为我们作业是爬取学校论坛,必须要登陆,不然爬不到任何数据。首先用chrome访问这个地址,按F12,在右侧寻找到用户名和密码输入位置,和登陆按钮。

下面用第一种方式(id)来定位:

input_username = browser.find_element_by_id('u_login_id')
input_username.send_keys("xxx")
input_pwd = browser.find_element_by_id('u_login_passwd')
input_pwd.send_keys("xxxxxx")
button = browser.find_element_by_id('u_login_submit')
button.click()

当然也可以用另一种,下面获取数据的时候展示。

如果需要登陆的话,一般都会有延迟,所以需要登陆后等一段时间再进行操作,我选择了5s,会比较安全,如果不等待的话很容易报错。

import time
time.sleep(5)

获取文字和url

我做的功能非常简单,就是获取主题和链接,从一条到一页到任意页,下面来一点点实现。

首先还是在页面选择需要爬取的数据,能看到用第一种方法会很复杂,那么用xpath,获取xpath非常简单,只需右键选择Copy->Copy XPath,就获得了//*[@id="body"]/div[3]/table/tbody/tr[1]/td[2]/a

正好我们需要的内容都在这一项里,我尝试过了直接在xpath后面加/text()/@href,但是会报错,下面这种方式就可以成功运行啦,上面是获取文字,下面是获取url。

lis = browser.find_element_by_xpath('//*[@id="body"]/div[3]/table/tbody/tr[1]/td[2]/a')
print(lis.text)
print(lis.get_attribute("href"))

这只是一条,那么想要把整页的主题和url都爬取下来,怎么办呢?

我也把这页的最后一项的xpath获取了://*[@id="body"]/div[3]/table/tbody/tr[30]/td[2]/a,可以发现一页30条,在tr[]中序号有所改变,那么用循环来更改就可以实现了。

第二页呢?

本来想点击翻页,但发现第二页的url比第一页多了?p=2,于是采用更改url的方法获取。除了第一页需要登陆,后续页面可以直接爬取数据,无需登录。

后记!!

有几个浪费了好多时间: 1 一定要确认Python安装和配置好了,我的就是之前安装的,但没有配置路径,而我一开始也不知道这个问题,直到写这篇文章的时候才意识到。我当时是新下载了一个python,安装的时候勾选最底下那个,就不用配置环境变量了。

2 真的,安装和配置就是最大的坑,一个接一个,driver的配置环境变量当初也出问题的,我调整了一下,至今也不知道哪里出问题的。

3登陆后要是报错一定要等待几秒,我当初还以为是什么别的问题,直到我把浏览器一直开着。不要一开始调试的时候就关闭页面,让它开着好看到有没有什么问题出现,包括我一开始都不知道需要登陆。

4作业本来是要增量式爬取的,但我目前还不太会,等我再学习一下相关的知识。