爬虫 selenium

爬虫 selenium

前言

selenium可以像人一样打开浏览器,可以从selenium中直接提取网页上的各种信息,有些网页的请求数据是加密的,碰到这种情况我们就可以用selenium模拟浏览器去请求这些数据,跳过解密步骤

若是碰到打开浏览器自动关闭的情况下,是selenium的版本太高导致的,把版本换低一点就可以了

基本代码:

如果页面是ajax的,点击一下时,页面加载有点久会比代码慢,这样就会出现错误,所以得用time.sleep()来让程序等一下页面

from selenium.webdriver import Edge
from selenium.webdriver.common.keys import Keys     #导包,对应键盘按键
from selenium.webdriver.common.by import By
import time

web=Edge()							#创建浏览器对象
web.get("hettp://baidu.com")		#打开一个网站
time.sleep(1)

#找到输入框,输入python,输入回车或者点击搜索按键
web.find_element(by=By.XPATH,value='//*[@id="kw"]').send_keys('看剧',Keys.ENTER)

#切换到新窗口
web.switch_to.window(web.window_handles[-1])
#关掉子窗口
web.close()
#变更selenium窗口视角,回到原来的窗口
web.switch_to.window(web.window_handles[0])
#切换到默认的窗口,一般打开的第一个窗口就是默认的
wen.switch_to.default_content()

爬取一些电影的电影名字与作者

from selenium.webdriver import Edge
from selenium.webdriver.common.keys import Keys     #导包,对应键盘按键
from selenium.webdriver.common.by import By
import time

web=Edge()
web.get('https://www.baidu.com/')
# web.find_element_by_xpath('//*[@id="kw"]').send_keys('看剧',Keys.ENTER)
web.find_element(by=By.XPATH,value='//*[@id="kw"]').send_keys('看剧',Keys.ENTER)
time.sleep(3)

#在selenium眼中,新窗口默认时不切换过来的
web.switch_to.window(web.window_handles[-1])        #切换到新窗口
web.find_element(by=By.XPATH,value='//*[@id="4"]/div[1]/div[1]/h3/a').click()

在selenium的版本4.0后就不支持find_element_by_xpath()方法,推荐用find_element()这个方法得导入By包
# li=web.find_element_by_xpath('/html/body/div[1]/div/div[3]/div/div/div[1]/ul[1]/')

web.switch_to.window(web.window_handles[-1])		#切换窗口
lis=web.find_elements(by=By.XPATH,value='/html/body/div[1]/div/div[3]/div/div/div[1]/ul[1]/li')

for li in lis:
    tile=li.find_element(by=By.XPATH,value='./div/div[2]/h4/a').get_attribute('title')         #提取标题
    author=li.find_element(by=By.XPATH,value='./div/div[2]/p').text       #提取作者
    print(tile,author)

当遇到 iframe 的话,就是比如一个看电影的网页,它有各种播放器,这种就是一个页面里面嵌套一个页面,电影的数据其实是在它嵌套的那个页面里面,所以当我们用selenium去哪数据时,要先定位到iframe的元素,然后切换到iframe的窗口,这样就可以拿到电影数据

web.get('网页url')
iframe=web.find_element(by=By.XPATH,value='xpath路径')
web.switch_to.frame(iframe)

定位下拉列表

from selenium.webdriver import Chrome
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
import time

web Chrome()
web.get("https://www.endata.com.cn/Boxoffice/B0/Year/index.html")

#定位到下拉列表
sel_el = web.find_element(by=By.XPATH,value='//*[@id="OptionDate"]')
#对元素进行包装,包装成下拉菜单
sel = Select(sel_el)
#让浏览器进行调整选项
for i in range(len(sel.options)):			#i就是每一个下拉框选项的索引位置
	sel.select_by_index(i)					#按照索引进行切换	
	time.sleep(2)							#因为每次切换列表,网页都得刷新,所以让程序等一下
	table = web.find_element_by_xpath('//*[@id="TableList"]/table')
	print(table.text)						#打印所有文本信息
	print("===")

#其他却换下拉列表的方法
# select_by_value()		根据里面value的值进行切换
# select_by_visible_text()  根据文本进行切换
# select_by_index()			根据索引进行切换

无头浏览器

就是在selenium驱动浏览器时,可以不让浏览器打开,在后台执行,只需要返回数据给我们进行了

本质上与前面没什么区别,速度也没有快很多

from selenium.webdriver.chrome.options import Options		#配置无头浏览器要导入的库
from selenium.webdriver.common.by import By
from selenium.webdriver import Chrome

#配置好参数
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disbale-gpu")

web=Chrome(options=opt)		#把配置参数设置到浏览器里

这样无头浏览器就设置好了

拿到elements页面代码

有些页面源代码是跟elements页面代码是不一样的,页面数据是通过一个请求来加载进来到页面中的,可以认为是一个很标准的ajax请求,elements页面代码是经过数据加载以及js执行之后的结果的html的内容

用selenium就可以很轻松的拿到elements的页面代码

web=Chrome()
web.get("url")
page_source=web.page_source
print(page_source)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值