动态网页抓取( 爬取一个动态网页的数据(一):Selenium驱动 )
优采云 发布时间: 2021-12-13 02:10动态网页抓取(
爬取一个动态网页的数据(一):Selenium驱动
)
Python+Selenium 动态网页信息抓取
一、Selenium (一)Selenium 介绍
Selenium 是一个 Web 自动化测试工具。它最初是为 网站 自动化测试而开发的。类型就像我们用来玩游戏的按钮向导。可根据指定指令自动运行。不同的是,Selenium 可以直接在浏览器中运行。它支持所有主流浏览器(包括 PhantomJS 等非接口浏览器)。
Selenium 可以让浏览器根据我们的指令自动加载页面,获取需要的数据,甚至可以对页面进行截图,或者判断是否对网站 进行了某些操作。
Selenium 没有浏览器,不支持浏览器的功能。需要配合第三方浏览器使用。但是我们有时需要让它嵌入到代码中运行,所以我们可以使用一个叫做 PhantomJS 的工具来代替真正的浏览器。
(二)安装环境
1.安装依赖·
要开始使用 selenium,您需要安装一些依赖项
conda install selenium
1.安装驱动
使用selenium调用浏览器,还需要一个驱动,不同浏览器的webdriver需要单独安装
各浏览器下载地址:selenium官网驱动下载
火狐浏览器驱动:geckodriver
Chrome浏览器驱动:chromedriver、淘宝备用地址
IE浏览器驱动:IEDriverServer
Edge 浏览器驱动:MicrosoftWebDriver
Opera浏览器驱动:operadriver
PhantomJS 浏览器驱动:phantomjs
二、自动填写百度网页查询关键词,完成自动搜索
1.查看百度源码中搜索框的id和搜索按钮的id
2.获取百度网页
from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'F:\browserdriver\geckodriver-v0.30.0-win64\geckodriver.exe')
driver.get("https://www.baidu.com/")
如果正在运行,此时会打开百度的起始页
3.填写搜索框
p_input = driver.find_element_by_id('kw')
print(p_input)
print(p_input.location)
print(p_input.size)
print(p_input.send_keys('一只特立独行的猪'))
print(p_input.text)
4.模拟点击
使用另一个输入,即按钮的点击事件;或者表单的提交事件
p_btn = driver.find_element_by_id('su')
p_btn.click()
5.最终效果
三、 抓取动态网页的数据(一)网站 链接
(二)分析网页
1. 抓取网页元素
2.按钮属性
爬取一个页面后,需要翻页,即点击页面按钮。
可以发现Next按钮只有href属性,无法定位。并且第一页只有下一页按钮,后面的页面有上一页和下一页按钮,xpath无法定位,其子元素span(即箭头)在属性aria-hidden中第一页它是独一无二的。aria-hidden 属性存在于后续页面中,但 Next 的箭头始终是最后一个。
因此,您可以通过找到最后一个带有 aria-hidden 属性的 span 标签来点击跳转到下一页:
(3)网站页面
点击Nest,可以发现有10页网站
(三)代码实现
1.代码
import time
import csv
from bs4 import BeautifulSoup as bs
from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'F:\browserdriver\geckodriver-v0.30.0-win64\geckodriver.exe')
# 名言所在网站
driver.get("http://quotes.toscrape.com/js/")
# 所有数据
subjects = []
# 单个数据
subject=[]
#定义csv表头
quote_head=['名言','作者','标签']
#csv文件的路径和名字
quote_path='名人名言.csv'
#存放内容的列表
def write_csv(csv_head,csv_content,csv_path):
with open(csv_path, 'w', newline='',encoding='utf-8') as file:
fileWriter =csv.writer(file)
fileWriter.writerow(csv_head)
fileWriter.writerows(csv_content)
n = 10
for i in range(0, n):
driver.find_elements_by_class_name("quote")
res_list=driver.find_elements_by_class_name("quote")
# 分离出需要的内容
for tmp in res_list:
saying = tmp.find_element_by_class_name("text").text
author =tmp.find_element_by_class_name("author").text
tags =tmp.find_element_by_class_name("tags").text
subject=[]
subject.append(saying)
subject.append(author)
subject.append(tags)
print(subject)
subjects.append(subject)
subject=[]
write_csv(quote_head,subjects,quote_path)
print('成功爬取第' + str(i + 1) + '页')
if i == n-1:
break
driver.find_elements_by_css_selector('[aria-hidden]')[-1].click()
time.sleep(2)
driver.close()
2.保存的抓取结果
表中有100条信息
四、爬取京东感兴趣的书籍信息网站(一)爬取网站
京东:
(二)网络分析
1.查看网站首页、输入框和搜索按钮
2.图书展示列表,J_goodsList下
3.标签一一对应
每本书都有一个li标签
有很多 li 标签
4.li中的具体内容
(1)价格
(2)书名
(3)按