代码核心在于这几个部分:
其一:使用元素定位来获取页面上指定需要抓取的关键字;
其二:将页面上定位得到的数据永久存储到本地文件中。
具体来梳理一下从访问URL开始到爬取数据整个流程下来的各个节点我们都做了哪些工作。
我们来看看spider()方法里面具体做了哪些事情:
spider() 方法实现
1、创建浏览器对象
-
# 创建浏览器对象
-
drver = webdriver.Chrome()
通过 webdriver.Chrome() 创建浏览器对象后,会自动启动并打开Chrome浏览器。在 Chrome() 方法中未传入任何参数,即使用默认参数 executable_path="chromedriver" ,executable_path表示的是Chrome浏览器驱动的位置,该参数默认浏览器驱动的位置是在Python安装目录下。如果你的浏览器驱动位置与默认位置不同,则 executable_path 参数需要传入驱动的实际位置。
2、访问URL地址
-
# 浏览器访问地址
-
drver.get(url)
打开浏览器后driver调用get(url) 方法在地址栏中访问该网址。
3、隐式等待、最大化浏览器窗口
-
# 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
-
drver.implicitly_wait(3)
-
# 最大化浏览器窗口,主要是防止内容被遮挡
-
drver.maximize_window()
先使用 implicitly_wait() 方法隐式等待浏览器将页面完全加载出来,再使用maximize_window()将浏览器窗口最大化,防止页面元素未加载出来或被遮挡而查找失败。
4、定位搜索框
-
# 通过id=key定位到搜索框
-
input_search = drver.find_element_by_id('key')
-
# 在输入框中输入“口罩”
-
input_search.send_keys(keyword)
-
# 模拟键盘回车Enter操作进行搜索
-
input_search.send_keys(Keys.ENTER)
-
# 强制等待3秒
-
sleep(3)
driver 先调用 find_element_by_id('key') 通过ID定位到该搜索框,再调用 sent_keys() 传入参数搜索关键字 keyword ,然后在sent_keys() 中传入 Keys.ENTER 模拟键盘回车键,最后再调用 sleep(3) 强制等待搜索内容加载出来。至此, 定位搜索框->搜索框输入关键字->回车搜索 ,整个搜索流程就完成了。
5、调用 get_good() 方法抓取商品数据
-
# 抓取商品数据
-
get_good(drver)
将抓取商品数据的具体操作步骤封装成 get_good() 方法并传入driver参数调用。
6、退出浏览器
-
# 退出关闭浏览器
-
drver.quit()
抓取完商品数据后就可以直接将浏览器关闭,释放资源了。这就是整个爬取的过程,而抓取数据的过程再接着继续分析。
get_good() 方法实现
完整代码
-
# -*- coding: utf-8 -*-
-
# @Time : 2021/10/26 17:35
-
# @Author : Jane
-
# @Software: PyCharm
-
# 导入库
-
from time import sleep
-
from selenium import webdriver
-
from selenium.webdriver.common.keys import Keys # 键盘按键操作
-
from os import path
-
def spider(url, keyword):
-
# 创建浏览器对象
-
drver = webdriver.Chrome()
-
# 浏览器访问地址
-
drver.get(url)
-
# 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
-
drver.implicitly_wait(3)
-
# 最大化浏览器窗口,主要是防止内容被遮挡
-
drver.maximize_window()
-
# 通过id=key定位到搜索框
-
input_search = drver.find_element_by_id('key')
-
# 在输入框中输入“口罩”
-
input_search.send_keys(keyword)
-
# 模拟键盘回车Enter操作进行搜索
-
input_search.send_keys(Keys.ENTER)
-
# 强制等待3秒
-
sleep(3)
-
# 抓取商品数据
-
get_good(drver)
-
# 退出关闭浏览器
-
drver.quit()
-
# 抓取商品数据
-
def get_good(driver):
-
# 获取当前第一页所有商品的li标签
-
goods = driver.find_elements_by_class_name('gl-item')
-
for good in goods:
-
# 获取商品链接
-
link = good.find_element_by_tag_name('a').get_attribute('href')
-
# 获取商品标题名称
-
title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')
-
# 获取商品价格
-
price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')
-
# 获取商品评价数量
-
commit = good.find_element_by_css_selector('.p-commit a').text
-
# 格式化商品信息
-
msg = '''
-
商品:%s
-
链接:%s
-
价格:%s
-
评论:%s
-
'''%(title, link, price, commit)
-
# 保存商品数据到txt文件中
-
saveTXT(msg)
-
# 保存商品数据到txt文件中
-
def saveTXT(msg):
-
# 获取当前文件路径
-
paths = path.dirname(__file__)
-
# 将当前文件路径与文件名拼接起来作为商品数据的存储路径
-
file = path.join(paths, 'good_data.txt')
-
# 以追加写入的方式将商品数据保存到文件中
-
with open(file, 'a+', encoding='utf-8') as wf:
-
wf.write(msg)
-
# 判断文件程序入口
-
if __name__ == '__main__':
-
# 京东商城网址
-
url = 'https://www.jd.com/'
-
# 搜索关键字“女士编包”
-
keyword = '女士包包'
-
# 爬取数据
-
spider(url, keyword)
将数据存储到CSV文件中
-
# -*- coding: utf-8 -*-
-
# @Time : 2021/10/26 17:35
-
# @Author : Jane
-
# @Software: PyCharm
-
# 导入库
-
from time import sleep
-
from selenium import webdriver
-
from selenium.webdriver.common.keys import Keys # 键盘按键操作
-
from os import path
-
import csv
-
def spider(url, keyword):
-
# 创建浏览器对象
-
drver = webdriver.Chrome()
-
# 浏览器访问地址
-
drver.get(url)
-
# 隐式等待,确保动态内容节点被完全加载出来——时间感受不到
-
drver.implicitly_wait(3)
-
# 最大化浏览器窗口,主要是防止内容被遮挡
-
drver.maximize_window()
-
# 通过id=key定位到搜索框
-
input_search = drver.find_element_by_id('key')
-
# 在输入框中输入“口罩”
-
input_search.send_keys(keyword)
-
# 模拟键盘回车Enter操作进行搜索
-
input_search.send_keys(Keys.ENTER)
-
# 强制等待3秒
-
sleep(3)
-
# 抓取商品数据
-
get_good(drver)
-
# 退出关闭浏览器
-
drver.quit()
-
# 抓取商品数据
-
def get_good(driver):
-
# 获取当前第一页所有商品的li标签
-
goods = driver.find_elements_by_class_name('gl-item')
-
data = []
-
for good in goods:
-
# 获取商品链接
-
link = good.find_element_by_tag_name('a').get_attribute('href')
-
# 获取商品标题名称
-
title = good.find_element_by_css_selector('.p-name em').text.replace('\n', '')
-
# 获取商品价格
-
price = good.find_element_by_css_selector('.p-price strong').text.replace('\n', '')
-
# 获取商品评价数量
-
commit = good.find_element_by_css_selector('.p-commit a').text
-
# 将商品数据存入字典
-
good_data = {
-
'商品标题':title,
-
'商品价格':price,
-
'商品链接':link,
-
'评论量':commit
-
}
-
data.append(good_data)
-
saveCSV(data)
-
# 保存商品数据到CSV文件中
-
def saveCSV(data):
-
# 表头
-
header = ['商品标题', '商品价格', '商品链接', '评论量']
-
# 获取当前文件路径
-
paths = path.dirname(__file__)
-
# 将当前文件路径与文件名拼接起来作为商品数据的存储路径
-
file = path.join(paths, 'good_data.csv')
-
# 以追加写入的方式将商品数据保存到文件中
-
with open(file, 'a+', encoding='utf-8', newline='') as wf:
-
f_csv = csv.DictWriter(wf, header)
-
f_csv.writeheader()
-
f_csv.writerows(data)
-
# 判断文件程序入口
-
if __name__ == '__main__':
-
# 京东商城网址
-
url = 'https://www.jd.com/'
-
# 搜索关键字“女士编包”
-
keyword = '女士包包'
-
# 爬取数据
-
spider(url, keyword)
行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。