ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动态网页的信息爬取

2021-12-15 11:03:20  阅读:123  来源: 互联网

标签:csv 网页 name text driver 爬取 book 动态


文章目录



1、关于selenium

    1、Selenium简介:Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。它可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

    2、使用命令conda install selenium安装selenium
在这里插入图片描述

    3、安装驱动,不同的浏览器驱动是不同的
我以火狐浏览器为例,安装过程可参照:驱动安装

    4、测试驱动安装成功

driver = webdriver.Firefox(executable_path=r'E:\new\geckodriver-v0.30.0-win64\geckodriver.exe')
driver.get("https://www.baidu.com/")

在这里插入图片描述

2、网页自动化测试

    1、检查百度浏览器首页源代码中搜素框的id以及搜索按钮的id
在这里插入图片描述

    2、填充搜索框

p_input = driver.find_element_by_id('kw')
print(p_input)
print(p_input.location)
print(p_input.size)
print(p_input.send_keys('an_ning'))
print(p_input.text)

在这里插入图片描述
其中location是元素的位置、size是元素的大小、send_keys是给元素传入值,这里,我们再传入python之后,会自动展开搜索

    3、模拟点击,既用另一个input,也就是按钮的点击事件来实现;或者是form表单的提交事件

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

在这里插入图片描述

3、动态网页数据爬取

    1、首先分析需要爬取的元素:含有quote类的标签即为所要的标签;text类名言,author为作者,tags为标签
(爬取网站:http://quotes.toscrape.com/js/
在这里插入图片描述

    2、可以看到网页一共有10页
在这里插入图片描述

    3、实现代码

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()

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

在这里插入图片描述

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

    1、在网站首页的开发者工具里查看网站的搜索框和搜索按钮id(爬取网:https://www.jd.com/)
在这里插入图片描述

    2、可以看到,J_goodlist为书的列表
在这里插入图片描述

    3、其中li标签内单本书的信息,里面的p-img为书的图片、p-name为书名、p-price为书价
在这里插入图片描述

    4、翻页
在这里插入图片描述

    5、找到需要的信息之后就可以实现代码爬取数据了

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 15 10:46:31 2021

@author: 861517387368
"""

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.Firefox(executable_path=r'E:\new\geckodriver-v0.30.0-win64\geckodriver.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)
        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()

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

5、总结

    本次实验通过Selenium爬取网页,在实现的过程中了解网页爬取的过程,以此促进自己的知识巩固,同时网页学习的爬取在我们平时的信息和工作中也有很大的实际意义,它能够帮助我们找到我们需要的信息。

参考:
https://zhuanlan.zhihu.com/p/331712873
https://blog.csdn.net/weixin_56102526/article/details/121870172?spm=1001.2014.3001.5501

标签:csv,网页,name,text,driver,爬取,book,动态
来源: https://blog.csdn.net/qq_46689721/article/details/121922962

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有