Python动态网页的信息爬取

news/2024/7/19 11:25:26 标签: python, 爬虫

目录

  • 一、Selenium自动化测试框架
  • 二、对网页进行自动化测试
  • 三、爬取指定网页的名言
    • 1.分析网页
    • 2.代码
  • 四、爬取京东网站上的感兴趣书籍信息
    • 1.分析网页
    • 2.代码
  • 五、总结
  • 参考资料

一、Selenium自动化测试框架

什么是自动化测试
自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行
结果。总的概括即:将人为驱动的测试行为转化为机器执行的过程。

进入今天的主角:selenium 学习功能测试自动化首选工具就是selenium,它是一个web自动化测试工具。
selenium的特点
支持多平台:IE、Chrome、Firefox、edge、Safari
支持多语言:Python、C、Java、C#、ruby、js
免费小巧,支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器执行,相当于分发机的功能。
selenium的实现原理
Selenium主要有三个版本,分别是Selenium1.0,Selenium2.0,Selenium3.0

Selenium1.0:包括selenium IDE、selenium RC、selenium Grid(支持分布式)。Selenium1.0核心是selenium RC,所以Selenium1.0又称为Selenium RC,它是在浏览器中运用JavaScript应用,即用JavaScript代码获取页面上的任何元素并执行各种操作

Selenium2.0:核心是WebDriver,Selenium+WebDriver

WebDriver的原理:

(1)启动web浏览器,后台会同时启动基于Webdriver Wire协议的Web服务器作为selenium的远程服务器,并将其与浏览器绑定。绑定完成之后,服务器就开始监听客户端的操作请求。

(2)执行测试时,测试用例会作为客户端,将需要执行的页面操作请求以HTTP请求的方式发送给远程服务器。该HTTP请求的正文以Webdriver Wire协议规定的JSON格式来描述需要浏览器执行的具体操作。

(3)远程服务器接收到请求后,会对请求进行解析,并将解析结果发送给Webdriver,由Webdriver实际执行浏览器的操作。

(4)Webdriver可以看作是直接操作浏览器的原生组件,所以搭建测试环境时,通常需要先下载浏览器对应的WebDriver。

二、对网页进行自动化测试

创建一个虚拟环境,除了
安装依赖
pip install selenium
安装一个驱动(我选的Edge):
火狐、谷歌、Edge等浏览器的驱动下载
下载后有一个exe文件
将该文件添加到系统环境变量的PATH下
测试

python">from selenium import webdriver

driver = webdriver.Edge(executable_path=r'C:\\Users\\86150\\Downloads\\edgedriver_win64\\msedgedriver.exe')
driver.get("https://www.baidu.com/")

运行上面的代码,会自动使用Edge浏览器打开百度界面:
在这里插入图片描述

定位元素
我们打开一个网页之后,我们就可以定位我们指定的页面元素,比如文本款,按钮等
我们继续以百度为例,在浏览器中,使用开发者工具(F12),查看代码
在这里插入图片描述

在这里插入图片描述

这里应该是这个input,它属于一个form表单
大概可以使用这几种方式来确定一个元素
这里先使用id来找到这个元素

python">p_input = driver.find_element_by_id('kw')
print(p_input)
print(p_input.location)
print(p_input.size)
p_input.send_keys('C#')
print(p_input.get_property('name'))
print(p_input.get_property('value'))

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

我们在传入搜索值之后,页面切换了,但是,并没有进行搜索,我们还差一步搜索.
为了出发搜索,我们可以使用另一个input,也就是按钮的点击事件来实现;或者是form表单的提交事件:
打开开发者选项查看“百度一下”的id
在这里插入图片描述

python">p_btn = driver.find_element_by_id('su')
p_btn.click()

重新执行后,就会进行搜索了
在这里插入图片描述

三、爬取指定网页的名言

1.分析网页

分析目的网址http://quotes.toscrape.com/js/:
在开发者工具中可发现每一组名言(名言+名人)都是在一个class="quote"的div中,并且没有其他class="quote的标签,名言句子在div下的class="text"的标签中,作者在class="author"的small标签中::
在这里插入图片描述

根据以上分析可以写出爬取一页的代码:

python">import time
import csv
from bs4 import BeautifulSoup as bs
from selenium import webdriver
driver = webdriver.Edge(executable_path=r'C:\\Users\\86150\\Downloads\\edgedriver_win64\\msedgedriver.exe')
driver.get('http://quotes.toscrape.com/js/')
div_list = driver.find_elements_by_class_name('quote')
print(len(div_list))
for div in div_list:
    saying = div.find_element_by_class_name('text').text
    author = div.find_element_by_class_name('author').text
    info = [saying, author]
    print(info)

在这里插入图片描述

爬取一页后,需要进行翻页,即点击翻页按钮。

可发现Next按钮只有href属性,无法定位。且第一页只有下一页按钮,之后的页数有上一页和下一页按钮,则也无法通过xpath定位,而其子元素span(即箭头)在第一页中的属性aria-hidden是唯一的,在之后的页数中存在aria-hidden该属性,但Next的箭头总是最后一个。
因此可以通过查找最后一个有aria-hidden属性的span标签,进行点击以跳转到下一页:
在这里插入图片描述

手动点击next,发现网站共有10页
在这里插入图片描述

2.代码

爬取全部的代码:

python">import time
import csv
from bs4 import BeautifulSoup as bs
from selenium import webdriver
driver = webdriver.Edge(executable_path=r'C:\\Users\\86150\\Downloads\\edgedriver_win64\\msedgedriver.exe')
driver.get('http://quotes.toscrape.com/js/')
#定义csv表头
quote_head=['名言','作者']
#csv文件的路径和名字
quote_path='名人名言.csv'
#存放内容的列表
sayingAndAuthor=[]


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):
    div_list = driver.find_elements_by_class_name('quote')
    for div in div_list:
        saying = div.find_element_by_class_name('text').text
        author = div.find_element_by_class_name('author').text
        info=[]
        info.append(saying)
        info.append(author)
        sayingAndAuthor.append(info)
        write_csv(quote_head,sayingAndAuthor,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()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一共是100条名言。

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

1.分析网页

分析目的网址https://www.jd.com/
进入京东并搜索“java编程”:

python">web = webdriver.Edge(executable_path=r'C:\\Users\\86150\\Downloads\\edgedriver_win64\\msedgedriver.exe')
web.get('https://www.jd.com/')
web.find_element_by_id('key').send_keys('java编程', Keys.ENTER)  # 找到输入框输入,回车

使用开发者工具 可发现每一个商品信息都存在于class包含"gl-item"的li中(鼠标覆盖在某个li上时其class变为gl-item hover):
在这里插入图片描述

刚进入时可发现有30个li,但往下滑到页面低后,li数量变为60个,因此需要先往下滑动:
在这里插入图片描述

在这里插入图片描述

获取所有li如下:

python">web.execute_script('window.scrollTo(0, document.body.scrollHeight);')
time.sleep(2)
page_text = web.page_source
tree = etree.HTML(page_text)
li_list = tree.xpath('//li[contains(@class,"gl-item")]')
print(len(li_list))

获取每件书籍的信息,在循环中获取:

python"> for li in li_list:
        book_name = ''.join(li.xpath('.//div[@class="p-name"]/a/em/text()'))     # 书名
        price = '¥' + li.xpath('.//div[@class="p-price"]/strong/i/text()')[0]   # 价格
#对于作者和出版社,有的书没有作者或出版社(也可能都没有),则记为无:
		author_span = li.xpath('.//span[@class="p-bi-name"]/a/text()')
        if len(author_span) > 0:  # 作者
            author = author_span[0]
        else:
            author = '无'
        store_span = li.xpath('.//span[@class="p-bi-store"]/a[1]/text()')  # 出版社
        if len(store_span) > 0:
            store = store_span[0]
        else:
            store = '无'

2.代码

爬取200本书总体代码:

python">from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from lxml import etree
import csv
all_book_info = []
num=200
head=['书名', '价格', '作者', '出版社']
#csv文件的路径和名字
path='java编程.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):
    web.execute_script('window.scrollTo(0, document.body.scrollHeight);')
    time.sleep(2)
    page_text = web.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

web = webdriver.Edge(executable_path=r'C:\\Users\\86150\\Downloads\\edgedriver_win64\\msedgedriver.exe')
web.get('https://www.jd.com/')
web.maximize_window() # 全屏
web.find_element_by_id('key').send_keys('java编程', Keys.ENTER)  # 找到输入框输入,回车
time.sleep(2)

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

在这里插入图片描述

五、总结

使用Selenium能更简单的爬取动态网页,为收集资料提供了便利。

参考资料

Selenium自动化测试工具的介绍与使用
Python+Selenium使用(一)- 自动打开百度并进行搜索

https://blog.csdn.net/weixin_46628481/article/details/121661470?spm=1001.2014.3001.5501


http://www.niftyadmin.cn/n/1314006.html

相关文章

传呼机兴衰史:服务中国20余年

[导读]1983年,中国内地市场第一家寻呼台落户上海,标志着传呼机正式进入中国消费电子市场。 腾讯数码讯(苏扬)20世纪80年代开始,大众生活开始引入科技产品和元素,传呼机走进消费电子市场可以看成是一个标志性…

maven项目打包

1.mvn clean package -DskipTests 2.target目录下的war包放到tomcat webapp目录下 3.启动tomcat 4.查看端口占用ps -ef | grep tomcat转载于:https://www.cnblogs.com/tiantianquan/p/7613779.html

中国3大移动公司(电信,联通,移动)频率分配大全(GSM,CDMA,CDMA2000,WCDMA,TD-SCDMA,LTE TD,FDD)

中国3大移动公司(电信,联通,移动)频率分配大全(GSM,CDMA,CDMA2000,WCDMA,TD-SCDMA,LTE TD,FDD) TD-LTE频率分配(2013.12.5): 中国移动:1880-1900MHz(目前个别地区建为3G网络,B39:1880-1920)、2320-2370MHz(…

shell练习之绘图工具

用这个脚本再加一些自己的东西,可以制作出小游戏或者是某些需要键盘控制的脚本。 先上图 wasd来上下左右移动,空格来变换绘画或者是清除模式,p退出脚本 1.可以把移动路径保存到数组里,下次循环调用可以把绘制过得图再显示出来 2.可…

常用频率频段

无线图像传输的常用频率介绍 无线图像传输 -常用频率介绍 GSM900/1800 双频段数字蜂窝移动台核准频率范围: Tx:885~915MHz/1710~1785MHzRx:930~960MHz/1805~1880MHz 说明: 1800M…

OpenCV with Python

目录一、Section #1 - Basics1.basic_functions2.contours3.draw4.read5.thresh6.transformations二、Section #2 - Advanced1.bitwise2.blurring3.colour_spaces4.gradients5.histogram6.masking7.rescale_resize8.splitmerge三、总结一、Section #1 - Basics 1.basic_functi…

属性字符串

* API: Character Attributes , NSAttributedString 共有21个属性* *1. NSFontAttributeName ->设置字体属性,默认值:字体:Helvetica(Neue) 字号:12 *2. NSParagraphStyleAttributeName ->设置文本段落排版格式,…

RFID技术中各频段电子标签的特点及其应用领域

一台RFID读写器可否识别几种不同频率的电子标签? 一般来说一台读写器可读写频率有: 125KHZ低频,其协议有ISO11784/11785 13.56MHZ高频,其协议有ISO14443A、ISO14443B、ISO15693等 915MHZ超高频,其协议有18000-6B/6C 因…