python爬虫[笔记记录二]

python爬虫[笔记记录一]
python爬虫[笔记记录二]

Selenium是一个用于测试Web应用程序的可移植框架。Selenium提供了一个回放(以前也是录制)工具,用于编写功能测试而无需学习测试脚本语言(Selenium IDE)。它还提供了一种特定于测试领域的语言(Selenese),可以用许多流行的编程语言编写测试,包括C#,Groovy,Java,Perl,PHP,Python,Ruby和Scala。然后,测试可以针对大多数现代Web浏览器运行 。Selenium在Windows,Linux和macOS平台上部署 (来自wiki)

我的环境:python3.7.1
所有代码,均有注释

安装selenium

1
pip3 install selenium

安装chromedriver
这里我使用的是chromedriver驱动,所以请注意,你需要提前下载到这些镜像站去下载chromedriver,然后将它安装在你的计算机上,并设置环境变量
http://chromedriver.storage.googleapis.com/index.html
https://npm.taobao.org/mirrors/chromedriver/

linux操作系统你可以直接将他复制到/usr/bin/目录下,而windows系统你只需要在计算机环境变量那个位置设置好你的chromedriver路径即可
或者你可以直接指定chromedriver位置,具体可以看下面代码

基本用法:登录

这是一个简单的登录,当访问页面的时候,利用time.sleep(1)来让程序等待1秒,防止页面在刷新的时候程序异常

1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver
import time


def web_selenium():
browser = webdriver.Chrome(executable_path="/usr/bin/chromedriver") # 设置chromedriver路径
browser.get("https://smelond.com/admin.php?a=admin") # 访问登录页面
time.sleep(1) # 注意,访问页面的时候会出现浏览器一直在转圈,所以这个时候可以将程序暂停1秒或多秒,根据你的网速
browser.find_element_by_xpath('//input [@name="username"]').send_keys('admin') #找到name为username的input标签,然后输入用户名admin
browser.find_element_by_xpath('//input [@name="password"]').send_keys('123456') # 输入密码
browser.find_element_by_xpath('//button [@name="loginsubmit"]').click() # 点击登录

web_selenium() # 执行函数

基本用法:一些常见的点击以及输入

这里利用 switch_to.frame 切换到找到的iframe标签里面去,最后在里面输入内容,最后利用switch_to.parent_frame()回到上一级窗口中,如果iframe里面还有iframe,如果你有需要,那么你可以多次利用这个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def browser_input(browser):
try:
browser.find_element_by_link_text("发布文章").click() # 利用find_element_by_link_text找到字符串并单击
time.sleep(3)
browser.find_element_by_xpath('//input [@name="subject"]').send_keys("输入测试") # 在input标签里面输入内容
time.sleep(1)
browser.switch_to.frame(browser.find_element_by_xpath('//iframe [@id="e_iframe"]')) # 切换到iframe标签里面去
time.sleep(1)
browser.find_element_by_xpath('//body').send_keys("测试iframe") # 在iframe里面输入内容
time.sleep(1)
browser.switch_to.parent_frame() # 跳出当前iframe,回到上一层
except:
pass

browser_input(browser) #执行函数

基本用法:加代理访问页面

在有的时候,可能需要访问一些国外网站,或者某内网网站,但是你在外网无法访问,这个时候就可以利用代理去访问
我这里使用的是socks5,当然你可以使用https或者http去访问,方法是一样,只需要将socks5修改一下即可

1
2
3
4
5
6
7
8
9
10
11
12
13
def web_proxy():
socks5 = "socks5://127.0.0.1:1080" # 代理地址
header_options = webdriver.ChromeOptions()
if socks5:
header_options.add_argument("--proxy-server=%s" % socks5) # 设置代理
browser = webdriver.Chrome(executable_path="/usr/bin/chromedriver",
chrome_options=header_options) # 添加驱动,代理
else:
browser = webdriver.Chrome(executable_path="/usr/bin/chromedriver")
browser.get("https://smelond.com/ip") # 访问页面
time.sleep(1)

web_proxy() # 执行函数

基本操作:获取页面上的html代码

注意,这种办法可以获取网页源代码不存在,而在elements里面存在的内容

1
2
3
elem_text = browser.find_element_by_xpath('//ul [@id="text_xx"]')  # 定位到ul标签
text = str(elem_text.get_attribute("innerHTML")) # 获取ul标签的代码
...... # 这个地方可以利用bs4解析一下,然后获取对应的内容

其他操作:执行js代码

利用execute_script可以执行js代码,因为在某些情况下,我们无法点击页面内容,原因可能是当前屏幕上selenium没有看到那个内容,内容在下一页,所以这个时候我们可以执行js代码,让屏幕下移动到纵坐标,之后就又可以进行屏幕上的操作

1
2
3
4
5
browser.execute_script('window.stop()')              # #调用js方法,同时执行javascript代码,这里的window.stop()是暂停
browser.execute_script("window.scrollBy(0, 700)"); # 移动到指定的坐标(相对当前的坐标移动)
browser.execute_script("window.scrollBy(0, 800)"); # 结合上面的scrollBy语句,相当于移动到700+800=1600像素位置
browser.execute_script("window.scrollTo(0, 1600)"); # 移动到窗口绝对位置坐标,如下移动到纵坐标1600像素位置
browser.execute_script("window.scrollTo(0, 1200)"); # 结合上面的scrollTo语句,仍然移动到纵坐标1200像素位置

其他操作:切换窗口

这种情况一般是你点击了一个a标签,然而他新建了一个窗口,所以你需要切换到第二个窗口去执行操作,这个时候就会用到switch_to.window,类似switch_to.frame

1
2
3
4
5
6
window_1 = browser.current_window_handle   # 获取当前窗口
windows = browser.window_handles # 获取所有窗口
for current_window in windows: # 循环所有窗口
if current_window != window_1: # 如果循环的窗口不等于当前窗口
browser.switch_to.window(current_window) # 就切换到第二个窗口
time.sleep(3)

神操作:设置页面加载时间

这个好像没多少资料,我也是之前查询资料才查询到的
主要是可以设置selenium加载页面多久,在页面访问比较慢的时候可以使用这个
当然,它是一个全局参数,你后面每次使用get方法,都生效

1
2
3
4
5
6
7
8
9
def web_load_time():
browser = webdriver.Chrome(executable_path="/usr/bin/chromedriver") # 设置chromedriver路径
browser.set_page_load_timeout(20) # 设置加载时间,可以让页面只加载20秒
browser.set_script_timeout(20) # 这两种设置都进行才有效
try:
browser.get("https://smelond.com") # 访问url,如果访问速度比较慢,等待20秒
return browser
except: # 如果超时,抛出异常执行下面的内容
web_load_time()

神操作:无界面selenium

这个应该是比较常用的,因为在某些情况下,我们需要用selenium自动化,之后需要设置定时,每天去对某个网站的内容进行爬取,这种情况,我们不可能天天在那个时间段登录服务器,然后执行脚本。这样是很费神的,所以selenium有一个无界面的操作,让你命令行模式也可以使用selenium

运行环境centos7
软件:chrome chromedriver python3.x Xvfb
使用的python库:selenium pyvirtualdisplay

selenium 安装:

安装很简单 从http://chromedriver.storage.googleapis.com/index.html 下载对应selenium的chromedriver版本,对应版本具体可以百度
然后设置软连接,设置权限

1
2
ln -s 你的chromedriver路径 /usr/bin/chromedriver
chmod 777 chromedriver

chrome 安装:

1
2
cd /ect/yum.repos.d/  #打开centos存放yum的目录
vim google-chrome.repo # 新建一个google-chrome.repo

写入下面的配置:

1
2
3
4
5
6
[google-chrome] 
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

1
2
yum -y install google-chrome-stable  # 安装chrome浏览器
yum -y install google-chrome-stable --nogpgcheck # 如无法安装则使用这行

找到chrome的路径

1
2
which google-chrome-stable   # 找路径
ln -s 路径 /bin/chrome # 创建软连接

解决root用户不能运行chrome

1
2
编辑启动文件: /opt/google/chrome/google-chrome 
将最后一行改写为: exec -a "$0" "$HERE/chrome" "$@" --no-sandbox $HOME

安装Xvfb

1
2
3
4
yum update
yum install Xvfb
yum install libXfont
yum install xorg-x11-fonts*

安装selenium、pyvirtualdisplay

1
2
pip install selenium
pip install pyvirtualdisplay

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# /usr/bin/env python
# _*_ coding:utf-8 _*_
# blog: https://smelond.com

from selenium import webdriver
from pyvirtualdisplay import Display # 导入对应模块

display = Display(visible=0, size=(800, 600)) # 设置界面窗口大小
display.start() # 开启窗口
options = webdriver.ChromeOptions() # 设置驱动
options.add_argument('--headless') # 添加无界面
browser = webdriver.Chrome(chrome_options=options) # 将无界面添加到browser
browser.get("http://smelond.com") # 访问页面,这里现在不会弹出浏览器窗口了
print(browser.page_source) # 测试打印页面内容,是否成功
browser.quit() # 退出浏览器
display.stop() # 退出窗口

参考:
https://blog.csdn.net/ZincZhang/article/details/79797847
https://blog.csdn.net/lilongsy/article/details/76142497

本文标题:python爬虫[笔记记录二]

文章作者:smelond

发布时间:2019年02月16日 - 16:02

最后更新:2019年02月16日 - 19:02

原始链接:http://smelond.com/2019/02/16/python爬虫-笔记记录二/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

分享