Python+Selenium动态网页的信息爬取

Posted YouthBlood9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python+Selenium动态网页的信息爬取相关的知识,希望对你有一定的参考价值。

注:因为某些原因,原本的图片被判定为违规,咱就说很委屈。

Github源文件下载:https://github.com/longl118/Selenium

一、Selenium

1.1 简介

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。

1.2 配置

  • 安装依赖
    要开始使用selenium,需要安装一些依赖,打开Anaconda Prompt
conda install selenium

  • 安装驱动

要使用selenium去调用浏览器,还需要一个驱动,不同浏览器的webdriver需要独立安装
各浏览器下载地址:selenium官网驱动下载(https://www.selenium.dev/downloads/

Firefox浏览器驱动:geckodriver

Chrome浏览器驱动:chromedriver , taobao备用地址

IE浏览器驱动:IEDriverServer

Edge浏览器驱动:MicrosoftWebDriver

Opera浏览器驱动:operadriver

PhantomJS浏览器驱动:phantomjs

  • 下载后解压,将解压的chromedriver.exe文件添加到系统的环境变量(不知道有没有用,大佬的博客都是这样做的)

二、对百度进行自动化测试

2.1 进入百度搜索界面

  • 在Anaconda的jupyter中写入代码
from selenium import webdriver
driver=webdriver.Chrome('D:\\\\***\\\\chromedriver.exe')
#进入网页
driver.get("https://www.baidu.com/")
  • 这时会报错。我们就再次打开Anaconda Prompt,安装webdriver_manager:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
#进入网页
driver.get("https://www.baidu.com/")
  • 运行得到:

  • 点击那个链接,得到:

2.2 自动填充百度网页的查询关键字并完成自动搜索

  • 在百度页面右键,点击 检查
  • 我们可以看到 搜索框的id是 kw

  • 用代码找到该元素,并填取相应的值
p_input = driver.find_element_by_id("kw")
p_input.send_keys('爱奇艺')
  • 运行结果

  • 同样找到搜索按钮的 id ,为su

  • 点击该按钮
#点击搜索按钮
p_btn=driver.find_element_by_id('su')
p_btn.click()
  • 运行结果

三、爬取指定网页的名言

3.1 找到元素

  • 可以看到class为text

3.2 代码实现

  • 代码

from bs4 import BeautifulSoup as bs
from selenium import webdriver
import csv
from selenium.webdriver.chrome.options import Options
from tqdm import tqdm#在电脑终端上显示进度,使代码可视化进度加快
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('http://quotes.toscrape.com/js/')
#定义csv表头
quote_head=['名言','作者']
#csv文件的路径和名字
quote_path='C:\\\\Users\\\\28205\\\\Documents\\\\Tencent Files\\\\2820535964\\\\FileRecv\\\\quote_csv.csv'
#存放内容的列表
quote_content=[]

'''
function_name:write_csv
parameters:   csv_head,csv_content,csv_path
csv_head:     the csv file head
csv_content:  the csv file content,the number of columns equal to length of csv_head
csv_path:     the csv file route
'''
def write_csv(csv_head,csv_content,csv_path):
    with open(csv_path, 'w', newline='') as file:
        fileWriter =csv.writer(file)
        fileWriter.writerow(csv_head)
        fileWriter.writerows(csv_content)
        print('爬取信息成功')

###
#可以用find_elements_by_class_name获取所有含这个元素的集合(列表也有可能)
#然后把这个提取出来之后再用继续提取
quote=driver.find_elements_by_class_name("quote")
#将要收集的信息放在quote_content里
for i in tqdm(range(len(quote))):    
    quote_text=quote[i].find_element_by_class_name("text")
    quote_author=quote[i].find_element_by_class_name("author")
    temp=[]
    temp.append(quote_text.text)
    temp.append(quote_author.text)
    quote_content.append(temp)
write_csv(quote_head,quote_content,quote_path)

3.3 运行结果

  • 运行结果

  • csv文件:

四、Selenium:requests+Selenum爬取京东图书

4.1 查看页面元素

  • 打开京东页面查看页面元素,分析需要爬取信息的标签id:

  • 搜索红楼梦,查看元素


4.2 代码

from selenium import webdriver
import time
import csv
from tqdm import tqdm#在电脑终端上显示进度,使代码可视化进度加快
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
#加载页面
driver.get("https://www.jd.com/")
time.sleep(3)

#定义存放图书信息的列表
goods_info_list=[]
#爬取200本
goods_num=200
#定义表头
goods_head=['名字','价格','评价条数','店铺','链接']
#csv文件的路径和名字
goods_path='D:\\\\1azanshi\\\\a\\\\honglou1.csv'

#向输入框里输入Java
p_input = driver.find_element_by_id("key")
p_input.send_keys('红楼梦')

#button好像不能根据类名直接获取,先获取大的div,再获取按钮
from_filed=driver.find_element_by_class_name('form')
s_btn=from_filed.find_element_by_tag_name('button')
s_btn.click()#实现点击

#获取商品名字,价格,评价条数,店铺,链接
def get_prince_and_name(goods):
    #直接用css定位元素
    #获取名字
    goods_price=goods.find_element_by_css_selector('div.p-name')
    #获取价格
    goods_name=goods.find_element_by_css_selector('div.p-price')
    #获取评价条数
    goods_commit=goods.find_element_by_css_selector('div.p-commit')
    #获取店铺名称
    goods_shopnum=goods.find_element_by_css_selector('div.p-shopnum')
    #获取链接
    goods_herf=goods.find_element_by_css_selector('div.p-img>a').get_property('href')
    return goods_name,goods_price,goods_commit,goods_shopnum,goods_herf

def  drop_down(web_driver):
    #将滚动条调整至页面底部
    web_driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    time.sleep(3)

#获取爬取一页
def crawl_a_page(web_driver,goods_num):
    #获取图书列表
    drop_down(web_driver)
    goods_list=web_driver.find_elements_by_css_selector('div#J_goodsList>ul>li')
    #获取一个图书的价格、名字、链接
    for i in tqdm(range(len(goods_list))):
        goods_num-=1
        goods_price,goods_name,goods_commit,goods_shopnum,goods_herf=get_prince_and_name(goods_list[i])
        goods=[]
        goods.append(goods_price.text)
        goods.append(goods_name.text)
        goods.append(goods_commit.text)
        goods.append(goods_shopnum.text)
        goods.append(goods_herf)
        goods_info_list.append(goods)
        if goods_num==0:
            break
    return goods_num

while goods_num!=0:
    goods_num=crawl_a_page(driver,goods_num)
    btn=driver.find_element_by_class_name('pn-next').click()
    time.sleep(1)
write_csv(goods_head,goods_info_list,goods_path)

4.3 运行

  • 运行效果

  • .csv文件

小小的总结

  • 运行看自己的电脑被操纵,莫名有点有趣。
  • 本次实验,完成动态网页的信息爬取,和静态网页一样需要查看网页结构。找到元素id或者利用相关函数得到元素,最后将信息获取,存储。以及对Selenium爬取网页的原理过程也有一定的了解。

参考文献

  1. 动态网页爬虫:https://blog.csdn.net/qq_45659777/article/details/121722475
  2. Python+Selenium动态网页的信息爬取:
    https://blog.csdn.net/weixin_56102526/article/details/121870172
  3. 动态网页的信息爬取:https://blog.csdn.net/qq_46359931/article/details/121918256

以上是关于Python+Selenium动态网页的信息爬取的主要内容,如果未能解决你的问题,请参考以下文章

怎么爬取网页的动态内容,很多都是js动态生

动态网页爬取样例(WebCollector+selenium+phantomjs)

python3 怎样爬取动态加载的网页信息

Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息

[python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

selenium官网是动态网页吗