Python 爬取淘宝商品信息栏目的实现

作者:qq_45893626 时间:2023-06-23 06:43:56 

一、相关知识点

1.1、Selenium

Selenium是一个强大的开源Web功能测试工具系列,可进行读入测试套件、执行测试和记录测试结果,模拟真实用户操作,包括浏览页面、点击链接、输入文字、提交表单、触发鼠标事件等操作,并且能够对页面结果进行种种验证。也就是说,只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。

1.2、ActionChains
Actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互。这对于做更复杂的动作非常有用,比如悬停和拖放。

1.3、time
返回当前时间的时间戳

1.4、lxml
lxml是一个Python库,使用它可以轻松处理XML和HTML文件,还可以用于web爬取。市面上有很多现成的XML解析器,但是为了获得更好的结果,开发人员有时更愿意编写自己的XML和HTML解析器。这时lxml库就派上用场了。这个库的主要优点是易于使用,在解析大型文档时速度非常快,归档的也非常好,并且提供了简单的转换方法来将数据转换为Python数据类型,从而使文件操作更容易。

1.5、csv
csv文件格式是一种通用的电子表格和数据库导入导出格式。最近我调用RPC处理服务器数据时,经常需要将数据做个存档便使用了这一方便的格式。

1.6、requests
Requests 库是一个优雅而简单的 Python HTTP 库,主要用于发送和处理 HTTP 请求

二、部分代码解析

加载Chrome驱动,动态解析爬取的网址


#提取公共的爬取信息的api
def commonsdk(self,url):
browser = webdriver.Chrome('D:/chromedriver.exe')
try:
browser.get(url)
except Exception as e:
browser.execute_script('window.stop()') # 超出时间则不加载
print(e, 'dynamic web load timeout')
return browser;

实现模拟登录

通过定位淘宝登陆界面的url的表单框,然后输入自己的用户名及密码,再模拟鼠标点击事件,继而提交表单信息实现用户登录。


#模拟登录
def logon(self,url,a_href_list_next):
username = "淘宝账户名"
password = "密码"
browser1 = self.commonsdk(url)
#登录账号
browser1.find_element_by_id('fm-login-id').send_keys(username)
browser1.find_element_by_id('fm-login-password').send_keys(password)
#模拟用户点击登录
browser1.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()
#解析商品信息
self.Buy_information(a_href_list_next,browser1)

爬取侧边栏目录
1、首先定位到目录分类栏,鼠标光标移动到需要选中的那一栏,继而会出现隐藏的div,(这里需要实现鼠标悬停事件)action.move_to_element(li_list).perform()实现了这一功能。
2、然后定位自己所需要爬取的侧边栏的那一行或多行,通过实现鼠标悬停事件后获取其中内容。
3、获取其超链接进入下一界面

Python 爬取淘宝商品信息栏目的实现


#爬取目录
def List(self,url):
browser = self.commonsdk(url)
#ActionChains类实现鼠标的单击、双击、拖拽等功能
action = ActionChains(browser)
li_list = browser.find_elements_by_css_selector('.service-bd li')[1]
#实现执行鼠标悬停,便于爬取悬停内容
action.move_to_element(li_list).perform()
time.sleep(5)

#爬取整个目录的div
div_list = browser.find_element_by_css_selector('.service-fi-links')
#爬取其中的总的名称
h5_list = div_list.find_elements_by_css_selector('h5')
#爬取小标题的名称
p_list = div_list.find_elements_by_css_selector('p')
#获取a标签
a_href_list = div_list.find_elements_by_css_selector('a')
#获取a标签的超链接
a_href_list_next = div_list.find_elements_by_css_selector('a')[1].get_attribute('href')

print(li_list.text)
for j in range(len(p_list)):
if j<len(p_list):
print(h5_list[j].text)
print(p_list[j].text)
for i in range(len(a_href_list)):
print(a_href_list[i].get_attribute('href'))

#获取登录框
logon = browser.find_element_by_id('J_SiteNavBd')
#获取登录框的超链接
logon_url = logon.find_element_by_css_selector('a').get_attribute('href')
#先关闭第一个网页
browser.close()
self.logon(logon_url,a_href_list_next)

获取商品信息

1、这里使用的定位方式是Xpath方式,使用了绝对定位来获取标签的位置。


#爬取商品信息
def Buy_information(self,url,browser):
browser.get(url)
div_list = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]')
img = div_list.find_element_by_css_selector('img')
img_url = "https:"+img.get_attribute('data-src')
price = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[1]/div[1]').text
number = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[1]/div[2]').text
shoping_information = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[2]').text
shop = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[3]/div[1]/a').text
adress = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[3]/div[2]').text
path = self.img_baocun(img_url)
data={
'图片路径':path,
'价格':price,
'购买人数':number,
'商品信息':shoping_information,
'商家':shop,
'籍贯':adress
}
self.write_dictionary_to_csv(data,'information')

下载图片

通过获取到的图片的url,然后将图片下载到指定的文件夹内


#下载照片
def img_baocun(self,url):
root = "文件夹下载的路径"//电脑上的绝对路径
path = root + url.split('?')[0].split('/')[-1].strip('')#获取jpg的名称
#判断是否存在该路径,不存在则创建
if not os.path.exists(root):
os.mkdir(root)
#判断是否存在该图片,存在则不下载
if not os.path.exists(path):
r = requests.get(url)
r.raise_for_status()
with open(path,'wb') as f:
f.write(r.content)
return path

将需要爬取的信息写入到csv文件中,便于查看
1、商品信息以字典的形式写入csv文件中方便查看。


#将解析得到的内容(字典格式)逐行写入csv文件
def write_dictionary_to_csv(self,dict,filename):
#格式化文件名
file_name='{}.csv'.format(filename)
with open(file_name, 'a',encoding='utf-8') as f:
file_exists = os.path.isfile(filename)
#delimiter(定界符)
w =csv.DictWriter(f, dict.keys(),delimiter=',', quotechar='"', lineterminator='\n',quoting=csv.QUOTE_ALL, skipinitialspace=True)
if not file_exists :
w.writeheader()
w.writerow(dict)
print('当前行写入csv成功!')

三、程序思路

1、首先定位到侧边栏的位置,然后使用action.move_to_element(li_list).perform()的方法实现鼠标的动态悬停,让隐藏的div显示出来,再获取其中的信息。
2、然后再实现模拟登录的功能,登录账号,获取其中的商品信息(由于淘宝的反扒机制,多次登录会让用户扫码登录,此功能暂未实现)
3、商品信息的获取使用Xpath的绝对定位方式来获取。

Xpath的使用方式:
 右键需要定位的标签->选中Copy选项->Copy Xpath

四、发展空间

1、解决淘宝反扒机制的问题。传送门,解决问题
2、文件的写入换用其他方式。

来源:https://blog.csdn.net/qq_45893626/article/details/112059577

标签:Python,爬取信息
0
投稿

猜你喜欢

  • 如何安装绿色版MySQL Community Server 5.7.16并实现远程登录

    2024-01-14 13:02:03
  • Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法

    2023-06-15 21:26:42
  • vue-element如何实现动态换肤存储

    2024-04-27 15:57:35
  • Kears 使用:通过回调函数保存最佳准确率下的模型操作

    2023-02-24 12:36:56
  • DreamweaverMX Ultradev探索:技巧荟萃

    2010-07-13 12:10:00
  • 浏览器是怎样工作的二:渲染引擎 HTML解析

    2012-05-09 20:34:20
  • 在Python中操作字符串之rstrip()方法的使用

    2022-03-22 18:34:36
  • 调试一段PHP程序时遇到的三个问题

    2023-06-22 11:39:22
  • git验证线上的版本是否符合预期

    2023-03-04 16:24:09
  • Python压缩解压缩zip文件及破解zip文件密码的方法

    2023-04-20 10:30:30
  • Mybatis update数据库死锁之获取数据库连接池等待

    2024-01-26 20:40:10
  • 你知道怎么在淘宝里进行投诉吗?

    2008-06-04 12:00:00
  • Pytorch上下采样函数之F.interpolate数组采样操作详解

    2022-01-19 08:13:51
  • linux系统使用python获取内存使用信息脚本分享

    2022-10-14 07:50:53
  • python的变量和简单数字类型详解

    2021-01-10 15:34:40
  • Python引用(import)文件夹下的py文件的方法

    2023-09-28 11:14:00
  • python发送邮件脚本

    2022-01-28 03:04:58
  • Python自动化测试利器selenium详解

    2021-06-07 20:22:10
  • python 安全地删除列表元素的方法

    2022-11-20 16:21:35
  • python 使用装饰器并记录log的示例代码

    2022-02-17 02:15:03
  • asp之家 网络编程 m.aspxhome.com