爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 10925|回复: 6

[源代码] 爬虫Selenium入门与实践示例:网站登录、百度搜索

[复制链接]

新浪微博达人勋

发表于 2020-12-15 10:20:48 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 15195775117 于 2020-12-15 11:32 编辑

timg.jpg

一、selenium缘起

一年之前(2019.12.4),我发现selenium很神奇,还发了个帖子:

神奇的selenium---浏览器操作自动化
上一周我学习了一下selenium,这东西半天就能看懂,着实简单(在前端知识的基础上),
selenium是个web自动化工具,可以模拟浏览器行为,
简单来说,它可以模仿人来操作浏览器,比如请求网页、点击网页链接、在网页输入框键入文本......
selenium好比一个机器人,模仿着人操作着浏览器。


注:Selenium自身也带有定位过滤函数,可以从网站返回的数据过滤有效数据
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-12-15 10:36:53 | 显示全部楼层
本帖最后由 15195775117 于 2020-12-17 15:03 编辑

二、伥鬼:PhantomJS


安装selenium:pip install selenium
查看Selenium的Webdriver支持的浏览器:
from selenium import webdriver
help(webdriver)
结果:
......
PACKAGE CONTENTS
    android (package)#移动端浏览器,移动端浏览器与PC端差异大
    blackberry (package)#移动端浏览器
    chrome (package)#常见
    common (package)#不管
    edge (package)#常见
    firefox (package)#常见
    ie (package)#常见
    opera (package)#常见
    phantomjs (package)#少见
    remote (package)
    safari (package)#常见
    support (package)#不管
    webkitgtk (package)
......



selenium模拟浏览器行为需要一个浏览器来辅助
以上信息列出了selenium支持的浏览器,许多学习资料推荐的是PhantomJS,

PhantomJS具有以下优点:
1、基于WebKit的服务器端的JS-API,全面支持Web且无需浏览器支持
2、支持DOM,css,json,canvas,svg.
3、可用于:页面自动化、网络监测、网页截屏、无界面测试...
4、无界面=开销小&速度快,无GUI的特点在服务器下是优点


为虎作伥:
PhantomJS自身是浏览器,而且帮助Selenium去欺骗其他浏览器,是为虎作伥的角色。


现在很多学习网站和平台都在讲PhantomJS的使用,但它和selenium已分道扬镳了,
目前越来越多的人在使用HeadlessChrome,其操作方式更像浏览器,但是安装比较麻烦,现在教程也比较少。
所以目前我依旧使用PhantomJS,毕竟原理应该都是一样的,学会了原理,即便再转HeadlessChrome,也是分分钟的事。


下载PhantomJS:
https://phantomjs.org/
(网站如此简陋寒酸!)附件是已经下载好的


下载好,解压缩,把phantomjs.exe所在目录加入环境变量


测试是否安装好:
from selenium import webdriver
driver=webdriver.PhantomJS()


phantomjs-2.1.1-windows.zip

17.35 MB, 下载次数: 13, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-15 11:12:49 | 显示全部楼层

59948299.jpg


三、实践案例:登录网站


许多网站需要先登录才能进去,例如上图这种环保监测平台,
在登录页,按F12(开发调试工具),在网页右侧会出现网页结构,
我们在右侧移动鼠标,左侧网页对应的元素会闪,这样我们就知道网页源码对应哪块了,
在我们需要的元素右击,选择copy,可以复制其各种信息,以密码输入框为例:

copy复制的内容
element<input name="pwd" type="password" id="pwd" maxlength="20" class="inputStyle userPaw" autocomplete="off">
outerHtml<input name="pwd" type="password" id="pwd" maxlength="20" class="inputStyle userPaw" autocomplete="off">
selector#pwd
JS pathdocument.querySelector("#pwd")
stylesmargin: 0;
position: absolute;
left: 86px;
top: 170px;
width: 230px;
background: transparent;
border: 0;
outline: none;
padding: 11px 10px;
XPath//*[@id="pwd"]
full XPath/html/body/form/div[4]/div[1]/div/input[2]



程序中,我们暂时使用full XPath来定位元素


from selenium import webdriver
import time

browser=webdriver.PhantomJS()
browser.get('http://xxx.xx.xxx.xx:xxxx/Login.aspx')#网址
browser.implicitly_wait(5)
# PhantomJS浏览器解释JS是需要时间的,
#给implicitly_wait函数一个时间参数,它会智能等待,解释完成后就进行下一步

print('网页标题:\n',browser.title)
# print('网页源代码:\n',browser.page_source)

#找出账号输入框
userBox=browser.find_element_by_xpath('/html/body/form/div[4]/div[1]/div/input[1]')
userBox.clear()#清空账号输入框
userBox.send_keys('xxxxxxx')#键入账号名

#找出密码输入框
passwordBox=browser.find_element_by_xpath('/html/body/form/div[4]/div[1]/div/input[2]')
passwordBox.clear()
passwordBox.send_keys('xxxxxx')

#找出登录按钮
loginBtn=browser.find_element_by_xpath('/html/body/form/div[4]/div[1]/div/div/div[2]/div/span')
loginBtn.click()#点击按钮

到这里,已实现了登录,登录以后又会出现新的网页了。

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-15 11:27:17 | 显示全部楼层
四、百度搜索:进击的巨人第四季

# 该模块使用百度搜索“xxx xxx”,保存搜索结果的标题和链接

from selenium import webdriver
browser=webdriver.PhantomJS()
browser.get('https://www.baidu.com/')
browser.implicitly_wait(5)

#先找出网页中的搜索文本框,右击网页查看源码,搜“type=text”,
# 发现可通过classname,id,name定位
#定位方式有三,选一即可:
textElement=browser.find_element_by_class_name('s_ipt')
# textElement=browser.find_element_by_id('kw')
# textElement=browser.find_element_by_name('wd')

textElement.clear()#先清空搜索框
textElement.send_keys('进击的巨人 第四季')#键入搜索内容

#然后找出网页中提交按钮的位置,在网页源码中搜索“submit”,
#发现可以通过class和id定位,
# submitElement=browser.find_element_by_class_name('')
submitElement=browser.find_element_by_id('su')
submitElement.click()#点击提交按钮

#由于百度的第一条结果可能是资讯集合,比较复杂,跳过之,获取第2-5条结果的标题和链接:
for num in range(2,6):
    # 使用id定位
    resultElement=browser.find_element_by_id(str(num))
    #获取element的文字或属性值,element.text和element.get_attribute(name)
    print('第'+str(num)+'条结果:')
    print('标题:\n',resultElement.text)
    # print(resultElement.get_attribute('class'))
    # #这里的class显示正确,不知为何按该class定位不了
    # print(resultElement.get_attribute('tpl'))


    x=resultElement.find_element_by_xpath('//*[@id="'+str(num)+'"]/h3/a')
    print('链接:\n',x.get_attribute('href'))


输出(太长,部分内容以省略号代表):
第2条结果:
标题:进击的巨人》第四季 01—彼岸_哔哩哔哩......
链接:http://www.baidu.com/link?url=......
第3条结果:
标题:...第四季人设图公布,艾伦引不满,靓仔被画成沧...
链接:http://www.......nzOCYadgj-GMa
第4条结果:
标题:进击的巨人第4季pv_哔哩哔哩 (゜-゜)つロ 干杯......- 百度快照
链接:http:......vZw-eIF3S4a
第5条结果:
标题:...也引起了强烈的不满,因为MAPPA把新角...
链接:http:......ibtu2TtSRpuXxxynK


#要查更多,就要翻页了,这需要定位翻页按钮并click之



密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-15 14:21:16 | 显示全部楼层
手动点赞,666
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-15 14:45:54 | 显示全部楼层

谢谢支持,多多交流,共同进步
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-15 15:08:46 | 显示全部楼层
五、截图工具与图像验证码
360截图20201215150015855.jpg

有时登录需要填写图像验证码的字符,这部分显然需要人工填写,
好在selenium有截图功能,我们可以将图像验证码截图下来,程序运行中间弹出图像,人为输入后再继续运行

截图功能示例如下:
from selenium import webdriver
browser=webdriver.PhantomJS()
browser.get('http://xxx.xxx.xxx.xx:8090/Account/Login?ReturnUrl=/Home/Index')
browser.implicitly_wait(5)


#图像元素的位置:
img=browser.find_elements_by_xpath('/html/body/div[2]/div[1]/div[2]/div[1]/div/div[3]/img')


#截图存放路径:
imgfile=r'C:\Users\Administrator\Desktop\verification_code.png'


#截图并保存:
# browser.save_screenshot(imgfile)
browser.get_screenshot_as_file(imgfile)



密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表