网页爬取不一定要用Selenium,Selenium是为了注入浏览器获取点击行为的调试工具,如果网页无需人工交互就可以抓取,不建议你使用selenium。要使用它,你需要安装一个工具软件,使用Chrome浏览器需要下载chromedriverexe到system32下,如使用firefox则要下载geckodriverexe到system32下。下面以chromedriver驱动chrome为例:
# -- coding:UTF-8 --from selenium import webdriver
from bs4 import BeautifulSoup
import re
import time
if __name__ == '__main__':
options = webdriverChromeOptions()
optionsadd_argument('user-agent="Mozilla/50 (Linux; Android 404; Galaxy Nexus Build/IMM76B) AppleWebKit/53519 (KHTML, like Gecko) Chrome/1801025133 Mobile Safari/53519"')
driver = webdriverChrome()
driverget('url')#你要抓取百度文库的URL,随便找个几十页的替换掉
html = driverpage_source
bf1 = BeautifulSoup(html, 'lxml')
result = bf1find_all(class_='rtcspage')
bf2 = BeautifulSoup(str(result[0]), 'lxml')
title = bf2divdivh1string
pagenum = bf2find_all(class_='size')
pagenum = BeautifulSoup(str(pagenum), 'lxml')spanstring
pagepattern = recompile('页数:(\d+)页')
num = int(pagepatternfindall(pagenum)[0])
print('文章标题:%s' % title)
print('文章页数:%d' % num)
while True:
num = num / 50
html = driverpage_source
bf1 = BeautifulSoup(html, 'lxml')
result = bf1find_all(class_='rtcspage')
for each_result in result:
bf2 = BeautifulSoup(str(each_result), 'lxml')
texts = bf2find_all('p')
for each_text in texts:
main_body = BeautifulSoup(str(each_text), 'lxml')
for each in main_bodyfind_all(True):
if eachname == 'span':
print(eachstringreplace('\xa0',''),end='')
elif eachname == 'br':
print('')
print('\n')
if num > 1:
page = driverfind_elements_by_xpath("//div[@class='page']")
driverexecute_script('arguments[0]scrollIntoView();', page[-1]) #拖动到可见的元素去
nextpage = driverfind_element_by_xpath("//a[@data-fun='next']")
nextpageclick()
timesleep(3)
else:
break
执行代码,chromedriver自动为你打开chrome浏览器,此时你翻页到最后,点击阅读更多,然后等一段时间后关闭浏览器,代码继续执行。
我们测试Ajax程序最大的麻烦,就是想上面一样来判断Ajax调用是否结束,上面我们是判断页面中如果出现”Hello World”,证明Ajax已经结束了,那么什么是更好的方法呢,我们经常使用的javascript的类库是JQuery,如何判断JQuery的Ajax调用已经结束了
selenium 查找页面元素方法
1、 Selenium by查找元素
特别强调一下:Byxpath()
绝对路径以单/号表示,而下面要讲的相对路径则以//表示,这个区别非常重要。另外需要多说一句的是,当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。
查找页面上id为loginForm的form元素:
查找页面上具有name属性为username的input元素:
2、 注解获取页面元素
方式有3种:@FindBy、@FindBys、@FindAll。
下文对3中类型的区别和使用场景进行介绍
1)@FindBy
2)@FindBys
@FindBys 相当于是取交集,是先根据第一个注解获取到对应元素,然后根据第二个注解再帅选出对应的页面元素,。如先找到符合classname=A的元素,再在这些元素集中找到id=B的所有元素
就像如下 *** 作:
3)@FindAll
@FindAll相当于是取并集,如找到id=A和id=B的所有元素
设置代理的话,可以使用这种方式,代码是我刚才测试过的,亲测可用from selenium import webdriver
chrome_options = webdriverChromeOptions()
chrome_optionsadd_argument('--proxy-server=>
单选比较好 *** 作,先定位需要单选的某个元素,然后点击一下即可。
多选好像也比较容易,依次定位需要选择的元素,点击即可。
下拉框的 *** 作相对复杂一些,需要用到Select模块。
先导入该类
在select模块中有以下定位方法
测试页面
然后,再演示下拉框的不同选择的方式
Selenium打开一个页面之后,默认是在父页面进行 *** 作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则需要切换到子页面进行擦走,这时候switch_toframe()就来了。如果想回到父页面,用switch_toparent_frame()即可。
既然是模拟浏览器 *** 作,自然也就需要能模拟鼠标的一些 *** 作了,这里需要导入ActionChains 类。
左键
这个其实就是页面交互 *** 作中的点击click() *** 作。
右键
context_click()
在上述 *** 作中
双击
double_click()
drag_and_drop(source,target)拖拽 *** 作嘛,开始位置和结束位置需要被指定,这个常用于滑块类验证码的 *** 作之类。
selenium中的Keys()类提供了大部分的键盘 *** 作方法,通过send_keys()方法来模拟键盘上的按键。
引入Keys类
常见的键盘 *** 作
send_keys(KeysBACK_SPACE):删除键(BackSpace)
send_keys(KeysSPACE):空格键(Space)
send_keys(KeysTAB):制表键(TAB)
send_keys(KeysESCAPE):回退键(ESCAPE)
send_keys(KeysENTER):回车键(ENTER)
send_keys(KeysCONTRL,'a'):全选(Ctrl+A)
send_keys(KeysCONTRL,'c'):复制(Ctrl+C)
send_keys(KeysCONTRL,'x'):剪切(Ctrl+X)
send_keys(KeysCONTRL,'v'):粘贴(Ctrl+V)
send_keys(KeysF1):键盘F1
send_keys(KeysF12):键盘F12
实例 *** 作演示:
定位需要 *** 作的元素,然后 *** 作即可!
如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候尝试在get方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。
等待有三种方式:强制等待、隐式等待和显式等待
1强制等待
直接timesleep(n)强制等待n秒,在执行get方法之后执行。
2隐式等待
implicitly_wait()设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常。
3 显式等待
设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异常。
WebDriverWait的参数说明:
WebDriverWait(driver,timeout,poll_frequency=05,ignored_exceptions=None)
driver: 浏览器驱动
timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
poll_frequency: 每次检测的间隔时间,默认是05秒
ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常
until(method,message='')
method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常
until_not(method,message='')
until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。
其他等待条件
还有一些 *** 作,比如下拉进度条,模拟javaScript,使用execute_script方法来实现。
在selenium使用过程中,还可以很方便对Cookie进行获取、添加与删除等 *** 作。
输出:
以上就是关于python,求一个简单的selenium+re的网页源码爬取全部的内容,包括:python,求一个简单的selenium+re的网页源码爬取、python+selenium 爬网页数据,function里面的数据怎么返回呢、selenium 获取元素方法-注解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)