浏览器抓取网页(python+selenium爬虫全流程详解+python爬虫简介 )
优采云 发布时间: 2022-03-13 21:08浏览器抓取网页(python+selenium爬虫全流程详解+python爬虫简介
)
python+selenium爬虫全流程详解
selenium+python爬虫介绍
本教程的大部分内容都是基于个人经验,其中一些是口语化的
如有不妥之处,请及时更正(可评论或私信)
硒测试脚本
Selenium其实是一个web自动化测试工具,可以完全模拟使用浏览器自动访问目标站点,通过代码操作进行web测试。
蟒蛇+硒
通过python+selenium的组合来实现爬虫是非常巧妙的。
由于是模拟人类点击操作,实际被反转的概率会大大降低。
Selenium 可以在页面上执行 js,处理 js 渲染的数据并模拟登录非常容易。
该技术还可以与正则表达式、bs4、request、ip pool等其他技术结合使用。
当然,由于在获取页面的过程中会发送很多请求,效率低,爬取速度也会比较慢。推荐用于小规模数据爬取。
selenium安装可以直接通过pip安装
pip3 install selenium
导入包
from selenium import webdriver
模拟浏览器----以chrome为例安装浏览器驱动
关联:
我们只需要在上面的链接中下载对应版本的驱动,放到python安装路径的scripts目录下即可。
浏览器版本可以在设置-关于Chrome中查看
当然,由于浏览器经常会自动更新,所以我们也记得在使用前更新相应的驱动程序。
基本操作的浏览器仿真
browser = webdriver.Chrome() # 打开浏览器
driver.maximize_window() # 最大化窗口
browser.minimize_window() # 最小化窗口
url='https://www.bilibili.com/v/popular/rank/all'#以该链接为例
browser.get(url)#访问相对应链接
browser.close#关闭浏览器
抓取数据 – 网站位置
以下知识需要一些网络相关知识作为前提
案例——b站排行榜
假设我们需要爬取上图中红圈内的文本数据,那么我们需要定位到这个地方的点
定位方法与实践
定位方式的选择主要取决于目标页面的情况。
#find_elements_by_xxx的形式是查找到多个元素(当前定位方法定位元素不唯一)
#结果为列表
browser.find_element_by_id('')# 通过标签id属性进行定位
browser.find_element_by_name("")# 通过标签name属性进行定位
browser.find_elements_by_class_name("")# 通过class名称进行定位
browser.find_element_by_tag_name("")# 通过标签名称进行定位
browser.find_element_by_css_selector('')# 通过CSS查找方式进行定位
browser.find_element_by_xpath('')# 通过xpath方式定位
#在chrome中可以通过源代码目标元素右键--Copy--Copy XPath/Copy full XPath
browser.find_element_by_link_text("")# 通过搜索 页面中 链接进行定位
browser.find_element_by_partial_link_text("")# 通过搜索 页面中 链接进行定位 ,可以支持模糊匹配
在网站的情况下,我们根据类名爬取,标签中的class="info"
from selenium import webdriver
browser = webdriver.Chrome()
# browser.minimize_window() # 最小化窗口
url='https://www.bilibili.com/v/popular/rank/all'
browser.get(url)
info=browser.find_elements_by_class_name('info')
#在目标网站中网站中标题class名称都为"info",所以用elements
for i in info:
print(i.text)
#.text为定位元素底下的所有文本,当然我们也可以获取标签里的东西(用其它函数),如视频链接:
# print(i.find_elements_by_tag_name('a')[0].get_attribute('href'))
结果
一些可能使用的方法(辅助爬虫/减少反爬)加快网页加载(不加载js、图片等)
options = webdriver.ChromeOptions()
prefs = {
'profile.default_content_setting_values': {
'images': 2,
'permissions.default.stylesheet':2,
'javascript': 2
}
}
options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=options)
异常捕获
from selenium.common.exceptions import NoSuchElementException
等待加载的网页
由于网速等问题,进入网站后页面还没有加载,需要等待。
selenium 自带的加载方式
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载
wait=WebDriverWait(browser,10) #显式等待:指定等待某个标签加载完毕
wait1=browser.implicitly_wait(10) #隐式等待:等待所有标签加载完毕
wait.until(EC.presence_of_element_located((By.CLASS_NAME,'tH0')))
等待时间与时间
import time
time.sleep(2)
在输入框中输入数据
ele = driver.find_element_by_id("kw") # 找到id为kw的节点
ele.send_keys("名称") # 向input输入框输入名称
#也可以driver.find_element_by_id("kw").send_keys("名称")