动态网页的信息爬取

一、相关概念及环境搭建

1.Selenium

selenium是一个自动化测试的工具,可以模拟人的操作,而且配合python来使用非常方便。Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium
可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

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

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

2.环境搭建

①使用命令安装selenium

conda install selenium

②下载Chrome的驱动
下载网站
选择和自己对应版本浏览器的依赖包下载,不然后面还需要其他操作,比较麻烦。
在这里插入图片描述
③将下载好的可执行文件添加至PATH下
在这里插入图片描述

二、代码测试

1.自动打开百度

代码

from selenium import webdriver
driver=webdriver.Chrome('D:\\software\\chromedriver_win32\\chromedriver.exe')
#进入网页
driver.get("https://www.baidu.com/")

在这个位置如果报以下错误,就是上面所说的版本不对应了。
在这里插入图片描述
通过安装webdriver_manager来解决webdriver的管理问题

pip install webdriver_manager

修改后的代码

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
#进入网页
driver.get("https://www.baidu.com/")

2.运行结果

在这里插入图片描述

3.网页分析

通过检查网页代码,可以对网页元素进行分析,这里主要找到网页的搜索框和触发按钮。
在这里插入图片描述
在这里插入图片描述

三、自动爬取

1.爬取指定网站

名言网站
分析该网站的元素,可以发现对应名言的id为text,还可以通过对网址分析发现该网站共有十页。找到其跳转页面的触发按钮即可。
在这里插入图片描述
代码

import time
import csv
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
# 名言所在网站
driver.get("http://quotes.toscrape.com/js/")
# 所有数据
subjects = []
# 单个数据
subject=[]
#定义csv表头
quote_head=['名言','作者','标签']
#csv文件的路径和名字
quote_path='D:/try45/666/名人名言.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()

运行结果
在这里插入图片描述

在这里插入图片描述
注意:如果出现文件为乱码的情况,将编码格式转化为NNSI试试。

3.爬取京东上感兴趣的内容

京东
①分析网站元素,找到网站输入框,查找框的id
在这里插入图片描述
在这里插入图片描述
②商品信息元素分析,找到书籍的价格名称出版商等元素
在这里插入图片描述
在这里插入图片描述
代码

import time
import csv
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from lxml import etree
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
# 京东所在网站
driver.get("https://www.jd.com/")

# 输入需要查找的关键字
p_input = driver.find_element_by_id('key')
p_input.send_keys('python编程')  # 找到输入框输入
time.sleep(1)
# 点击搜素按钮
button=driver.find_element_by_class_name("button").click()
time.sleep(1)
all_book_info = []
num=200
head=['书名', '价格', '作者', '出版社']
#csv文件的路径和名字
path='D:/try45/666/python编程.csv'
def write_csv(head,all_book_info,path):
    with open(path, 'w', newline='',encoding='utf-8') as file:
        fileWriter =csv.writer(file)
        fileWriter.writerow(head)
        fileWriter.writerows(all_book_info) 
# 爬取一页
def get_onePage_info(web,num):
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
    time.sleep(2)
    page_text =driver.page_source
    # with open('3-.html', 'w', encoding='utf-8')as fp:
    #     fp.write(page_text)
    # 进行解析
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//li[contains(@class,"gl-item")]')
    for li in li_list:
        num=num-1
        book_infos = []
        book_name = ''.join(li.xpath('.//div[@class="p-name"]/a/em/text()'))     # 书名
        book_infos.append(book_name)
        price = '¥' + li.xpath('.//div[@class="p-price"]/strong/i/text()')[0]   # 价格
        book_infos.append(price)
        author_span = li.xpath('.//span[@class="p-bi-name"]/a/text()')
        if len(author_span) > 0:  # 作者
            author = author_span[0]
        else:
            author = '无'
        book_infos.append(author)
        store_span = li.xpath('.//span[@class="p-bi-store"]/a[1]/text()')  # 出版社
        if len(store_span) > 0:
            store = store_span[0]
        else:
            store = '无'
        book_infos.append(store)
        all_book_info.append(book_infos)
        if num==0:
            break
    return num

while num!=0:
    num=get_onePage_info(driver,num)
    driver.find_element_by_class_name('pn-next').click()  # 点击下一页
    time.sleep(2)
write_csv(head,all_book_info,path)
driver.close()

运行结果
在这里插入图片描述

四、总结

加强了对于网页分析的能力,将原来做过的静态网页信息爬取变为了动态页面,学会了使用 Selenium自动化测试框架。

参考链接

Python+Selenium使用(一)- 自动打开百度并进行搜索
处理session not created: This version of ChromeDriver only supports Chrome version问题的方法
动态网页爬虫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值