内容 采集 软件(准备工作驱动安装实现案例之前,我们要先安装一个谷歌驱动 )
优采云 发布时间: 2022-03-11 19:15内容 采集 软件(准备工作驱动安装实现案例之前,我们要先安装一个谷歌驱动
)
准备安装驱动程序
在实现案例之前,我们需要安装一个谷歌驱动,因为我们使用selenium来控制谷歌驱动,然后控制浏览器实现自动操作,模拟人类行为来操作浏览器。
以谷歌浏览器为例,打开浏览器看到我们自己的版本,然后下载与你的浏览器版本相同或最相似的版本,下载后解压,将解压后的插件放到我们的python环境中,或者你可以也把它和代码放在一起。
模块使用及介绍流程分析
我们访问一个网站并输入一个URL,所以代码是这样写的。
首先导入模块
from selenium import webdriver
不要将文件名或包名命名为selenium,否则会导致导入失败。
Webdriver可以被认为是浏览器的驱动程序。要驱动浏览器,必须使用支持多种浏览器的webdriver。
实例化浏览器对象,我这里用的是google,建议大家用google,比较方便。
driver = webdriver.Chrome()
我们使用 get 访问一个 URL,它会自动打开该 URL。
driver.get('https://www.jd.com/')
运行
打开网站后,以购买口红为例。
我们首先需要通过您要购买的产品的关键字搜索产品信息,并利用搜索结果获取信息。
然后我们还要写一个输入,在空白处右击选择Check。
选择元素元素面板
用鼠标单击左侧的箭头按钮以单击搜索框,它将直接导航到搜索选项卡。
右键单击标签,选择复制,选择复制选择器。
如果你是 xpath,复制它的 xpath。
然后写下我们要搜索的内容
driver.find_element_by_css_selector('#key').send_keys('口红')
再次运行时会自动打开浏览器,输入目标网址搜索口红。
同样的方法,找到搜索按钮并点击它。
driver.find_element_by_css_selector('.button').click()
再次运行它,它会自动点击搜索。
页面被搜索到了,那么我们在正常浏览网页的时候需要把页面拉下来,对了,我们让它自动拉下来吧。
先导入时间模块
import time
执行页面滚动操作
def drop_down():
"""执行页面滚动的操作""" # javascript
for x in range(1, 12, 2): # for循环下拉次数,取1 3 5 7 9 11, 在你不断的下拉过程中, 页面高度也会变的;
time.sleep(1)
j = x / 9 # 1/9 3/9 5/9 9/9
# document.documentElement.scrollTop 指定滚动条的位置
# document.documentElement.scrollHeight 获取浏览器页面的最大高度
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
driver.execute_script(js) # 执行我们JS代码
循环被编写,然后被调用。
drop_down()
让我们再推迟一次
driver.implicitly_wait(10)
这是一个隐式等待,等待网页延迟,如果网络不好加载会很慢。
隐式等待不必等待十秒钟。您的网络在十秒内加载完毕后,随时会被加载。如果十秒后没有加载,就会强制加载。
还有另一种死亡等待。你写完后要等几秒,这样比较不人性化。
time.sleep(10)
加载完数据后,我们需要找到商品数据的来源
价格/标题/评论/封面/商店等。
或者右键查看,在element中,点击小箭头,点击要查看的数据。
可以看到都在li标签里面
获取所有的li标签内容,还是一样的,直接复制。
在左下角
这是第一个要取的,但是我们要获取所有的标签,所以左边框中li之后的可以删除。
如果没有,可以看到这里有60条商品数据,每页60条。
所以我们复制其余的并用 lis 接收它。
lis = driver.find_elements_by_css_selector('#J_goodsList ul li')
因为我们获取的是所有的label数据,所以比之前多了一个s
打印它
print(lis)
通过lis返回数据列表[]列表中的元素对象
迭代并取出所有元素。
for li in lis:
title = li.find_element_by_css_selector('.p-name em').text.replace('\n', '') # 商品标题 获取标签文本数据
price = li.find_element_by_css_selector('.p-price strong i').text # 价格
commit = li.find_element_by_css_selector('.p-commit strong a').text # 评论量
shop_name = li.find_element_by_css_selector('.J_im_icon a').text # 店铺名字
href = li.find_element_by_css_selector('.p-img a').get_attribute('href') # 商品详情页
icons = li.find_elements_by_css_selector('.p-icons i')
icon = ','.join([i.text for i in icons]) # 列表推导式 ','.join 以逗号把列表中的元素拼接成一个字符串数据
dit = {
'商品标题': title,
'商品价格': price,
'评论量': commit,
'店铺名字': shop_name,
'标签': icon,
'商品详情页': href,
}
csv_writer.writerow(dit)
print(title, price, commit, href, icon, sep=' | ')
搜索功能
key_world = input('请输入你想要获取商品数据: ')
待采集的数据,采集后保存为CSV
f = open(f'京东{key_world}商品数据.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'商品标题',
'商品价格',
'评论量',
'店铺名字',
'标签',
'商品详情页',
])
csv_writer.writeheader()
然后写一个自动翻页
for page in range(1, 11):
print(f'正在爬取第{page}页的数据内容')
time.sleep(1)
drop_down()
get_shop_info() # 下载数据
driver.find_element_by_css_selector('.pn-next').click() # 点击下一页
视频教程
后面就不写那么详细了,只是发了点东西,大家可以点击下面直接看视频
Python + selenium采集京东商品数据,保存Excel
完整代码
from selenium import webdriver
import time
import csv
def drop_down():
"""执行页面滚动的操作"""
for x in range(1, 12, 2):
time.sleep(1)
j = x / 9 # 1/9 3/9 5/9 9/9
# document.documentElement.scrollTop 指定滚动条的位置
# document.documentElement.scrollHeight 获取浏览器页面的最大高度
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
driver.execute_script(js) # 执行JS代码
key_world = input('请输入你想要获取商品数据: ')
f = open(f'京东{key_world}商品数据.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'商品标题',
'商品价格',
'评论量',
'店铺名字',
'标签',
'商品详情页',
])
csv_writer.writeheader()
# 实例化一个浏览器对象
driver = webdriver.Chrome()
driver.get('https://www.jd.com/') # 访问一个网址 打开浏览器 打开网址
# 通过css语法在element(元素面板)里面查找 #key 某个标签数据 输入一个关键词 口红
driver.find_element_by_css_selector('#key').send_keys(key_world) # 找到输入框标签
driver.find_element_by_css_selector('.button').click() # 找到搜索按钮 进行点击
# time.sleep(10) # 等待
# driver.implicitly_wait(10) # 隐式等待
def get_shop_info():
# 第一步 获取所有的li标签内容
driver.implicitly_wait(10)
lis = driver.find_elements_by_css_selector('#J_goodsList ul li') # 获取多个标签
# 返回数据 列表 [] 列表里面的元素 对象
# print(len(lis))
for li in lis:
title = li.find_element_by_css_selector('.p-name em').text.replace('\n', '') # 商品标题 获取标签文本数据
price = li.find_element_by_css_selector('.p-price strong i').text # 价格
commit = li.find_element_by_css_selector('.p-commit strong a').text # 评论量
shop_name = li.find_element_by_css_selector('.J_im_icon a').text # 店铺名字
href = li.find_element_by_css_selector('.p-img a').get_attribute('href') # 商品详情页
icons = li.find_elements_by_css_selector('.p-icons i')
icon = ','.join([i.text for i in icons]) # 列表推导式 ','.join 以逗号把列表中的元素拼接成一个字符串数据
dit = {
'商品标题': title,
'商品价格': price,
'评论量': commit,
'店铺名字': shop_name,
'标签': icon,
'商品详情页': href,
}
csv_writer.writerow(dit)
print(title, price, commit, href, icon, sep=' | ')
# print(href)
for page in range(1, 11):
print(f'正在爬取第{page}页的数据内容')
time.sleep(1)
drop_down()
get_shop_info() # 下载数据
driver.find_element_by_css_selector('.pn-next').click() # 点击下一页
driver.quit() # 关闭浏览器