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

文章目录

    • 一、Selenium
      • 1.1 简介
      • 1.2 配置环境
    • 二、自动填充百度网页的查询关键字并完成自动搜索
    • 三、爬取一个动态网页的数据
      • 3.1 查看元素
      • 3.2 代码
    • 四、爬取京东网站上的感兴趣书籍信息
      • 4.1 查看元素
      • 4.2 代码
    • 五、总结
    • 六、参考文献

一、Selenium

1.1 简介

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

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

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

1.2 配置环境

1.要开始使用selenium,需要安装一些依赖

pip install selenium

2.安装驱动

要使用selenium去调用浏览器,还需要一个驱动,不同浏览器的webdriver需要独立安装
推荐官网

我这里下载的是Chrome的驱动
测试是否安装成功:

from selenium import webdriver

driver = webdriver.Chrome(executable_path=r'chromedriver.exe')
driver.get("https://www.baidu.com/")

如果环境没有问题的话,就会弹出一个Chrome浏览器,打开百度网址
动态网页的信息爬取(Python+Selenium)_第1张图片

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

定位搜素框id,完成搜素框自动填充

在浏览器中,使用开发者工具,查看代码,定位搜索框的id,右键搜索框,点击检查,就可以看到搜索框的id
动态网页的信息爬取(Python+Selenium)_第2张图片
动态网页的信息爬取(Python+Selenium)_第3张图片
使用id来找到这个元素

from selenium import webdriver

# 打开一个Chrome浏览器,executable_path是Chrome浏览器驱动的路径
driver = webdriver.Chrome(executable_path=r'chromedriver.exe')
driver.get("https://www.baidu.com/")
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)

location,是元素的位置;
size是元素的大小
send_keys是给元素传入值,这里,我们再传入python之后,会自动展开搜索

结果如下:
动态网页的信息爬取(Python+Selenium)_第4张图片
定位百度一下的id,完成自动点击:

同样右键百度一下,点击检查,查看它的id
动态网页的信息爬取(Python+Selenium)_第5张图片

p_btn = driver.find_element_by_id('su')
p_btn.click()

结果:
动态网页的信息爬取(Python+Selenium)_第6张图片

三、爬取一个动态网页的数据

爬取的网站链接:http://quotes.toscrape.com/js/

3.1 查看元素

爬取元素
爬取的内容在quote里面
有text、author、tags
动态网页的信息爬取(Python+Selenium)_第7张图片
翻页

一页元素爬完之后需要进行翻页操作,所以需要查看相应属性
动态网页的信息爬取(Python+Selenium)_第8张图片
右击它,点击检查,查看。
可发现Next按钮只有href属性,无法定位。且第一页只有下一页按钮,之后的页数有上一页和下一页按钮,则也无法通过xpath定位,而其子元素span(即箭头)在第一页中的属性aria-hidden是唯一的,在之后的页数中存在aria-hidden该属性,但Next的箭头总是最后一个。
因此可以通过查找最后一个有aria-hidden属性的span标签,进行点击以跳转到下一页:
动态网页的信息爬取(Python+Selenium)_第9张图片
一直点击next,可以发现网站共有10页
动态网页的信息爬取(Python+Selenium)_第10张图片

3.2 代码

import time
import csv
from bs4 import BeautifulSoup as bs
from selenium import webdriver

driver = webdriver.Chrome(executable_path=r'chromedriver.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()

结果:
动态网页的信息爬取(Python+Selenium)_第11张图片

四、爬取京东网站上的感兴趣书籍信息

网站链接:https://www.jd.com/

4.1 查看元素

1.查看网站首页,输入框id和搜索按钮
动态网页的信息爬取(Python+Selenium)_第12张图片
2.查看要爬取的书籍相关信息

右击书本,点击检查,发现书籍都展示在J_goodsList下面,每一本书在li标签下

动态网页的信息爬取(Python+Selenium)_第13张图片
3.查看每一本书及li标签下具体内容
动态网页的信息爬取(Python+Selenium)_第14张图片

p-img: 书的图片
p-price:书价格
p-name:书名
p-commit:书的评价
p-shopnum:书店名

4.下一页
动态网页的信息爬取(Python+Selenium)_第15张图片

4.2 代码

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
driver = webdriver.Chrome(executable_path=r'chromedriver.exe')
# 京东所在网站
driver.get("https://www.jd.com/")

p_input = driver.find_element_by_id('key')# 找到输入框输入
p_input.send_keys('三体')  # 输入需要查找的关键字
time.sleep(1)

button=driver.find_element_by_class_name("button").click()# 点击搜素按钮
time.sleep(1)
all_book_info = []
num=200
head=['书名', '价格', '书店名']
#csv文件的路径和名字
path='网络爬虫书本.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)
        store_span = li.xpath('.//div[@class="p-shopnum"]/a/text()')  # 书店名
        # if len(store_span) > 0:
        #     store = store_span[0]
        # else:
        #     store = '无'
        book_infos.append(store_span)
        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()

结果:
动态网页的信息爬取(Python+Selenium)_第16张图片
注意这里根据自己要爬的内容自行修改:
动态网页的信息爬取(Python+Selenium)_第17张图片

五、总结

在爬取京东网站上的感兴趣书籍信息,代码好像有点问题,不知为啥书店名输出结果带的有一个框框,后续还得改进

六、参考文献

Python+Selenium使用(一)- 自动打开百度并进行搜索
Selenium:requests+Selenum爬取京东所有图书类的数据
https://blog.csdn.net/weixin_56102526/article/details/121870172

你可能感兴趣的:(python,selenium,chrome,爬虫)