前言
一个课程作业让爬下学校论坛版面,于是从来没有接触过爬虫的我,开始疯狂查寻资料,最终选了使用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
如果chrome更新到最新版本,拿着版本号去和比对就可以了,点开下载对应的压缩包就可以。如果是比较老的版本,上面没有显示,从2.46往前寻找,点开之后查notes.txt里面有写对应chrome的版本号。
打开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,在右侧寻找到用户名和密码输入位置,和登陆按钮。
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。
/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作业本来是要增量式爬取的,但我目前还不太会,等我再学习一下相关的知识。