python 采集数据,Python采集
快过年了没多久,想给女朋友买年货和礼物。分析一下价格,看看哪些是真正降价的。
00-1010预备驱动安装模块使用及介绍过程分析完整代码效果展示
目录
准备工作
在实现案例之前,我们要先安装一个Google驱动,因为我们用selenium来控制Google驱动,然后控制浏览器实现自动运行,模拟人类行为来操作浏览器。
以谷歌Chrome为例。打开浏览器,看看我们自己的版本,然后下载与我们自己的浏览器版本相同或最接近的版本。下载后解压,把解压后的插件放到我们的python环境中,或者和代码放在一起。
驱动安装
硒管安装硒。如果直接输入selenium,默认会安装最新版本。selenium后面添加的版本号就是安装的对应版本。
Csv内置模块,不需要安装,用于保存数据到Excel表格;
时间内置模块,不需要安装。时间模块主要用于延时等待。
模块使用与介绍
当我们访问一个网站时,我们需要输入一个URL,所以代码也是这样写的。
首先导入模块。
从selenium导入web驱动程序
或者文件名和包名不要命名为selenium,会导致无法导入。Webdriver可以认为是浏览器的驱动程序。要驱动浏览器,必须使用支持多种浏览器的webdriver。
实例化浏览器对象。我这里用的是谷歌。为了方便,建议你用谷歌。
driver=webdriver。铬合金()
我们使用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(。按钮)。单击()
如果再运行一次,会自动点击搜索。
搜索页已经出来了,所以我们正常浏览网页的时候,就要把网页拉下来了吧?就让它自动拉下来吧。首先导入时间模块
导入时间
执行页面滚动操作。
def下拉列表()
:
"""执行页面滚动的操作""" # 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 标签内容,还是一样的,直接copy 。
在左下角就有了
这里表示的是取的第一个,但是我们是要获取所有的标签,所以左边框框里 li 后面的可以删掉不要。
不要的话,可以看到这里是60个商品数据,一页是60个。
所以我们把剩下的复制过来, 用lis接收一下 。
lis = driver.find_elements_by_css_selector(#J_goodsList ul li)
因为我们是获取所有的标签数据,所以比之前多了一个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() # 点击下一页
完整代码
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() # 关闭浏览器
效果展示
代码是没得问题的,大家可以去试试
到此这篇关于详解Python如何批量采集京东商品数据流程的文章就介绍到这了,更多相关Python 采集京东商品数据内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。