用 python 爬取 某珠宝网站

  • GitHub:https://github.com/121812/python
  • 完整源代码在最下面
  • 转载请注明出处

人生苦短,我用python

最近因为客户需求,需求爬取珠宝网站做成表格

虽然博主是做Linux运维的,不过在学自动化运维的时候

接触过Python,熟悉了爬虫的几个常用框架

需求:

爬取 迪奥 网站的珠宝

写入Excel表

对各珠宝进行子分类如下

解决思路:

需要调用

import os
import re
import time
import request
import requests
import xlsxwriter
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

主要运用selenium框架,避开反爬策略

这里selenium使用的webdriver是 Chrome

需要爬取的页面:https://www.dior.cn/zh_cn/products/search?page=3&query=珠宝

代码如下:

设置webdriver路径

chrome="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"

没有webdriver的可以在这下载

https://pan.baidu.com/s/16-F-Eb6RU0-vRnAZCZv7kA

提取码:gf15

设置Chrome语言UTF-8,user-agent头(伪装成用户),最大化Chrome页面

options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Mobile Safari/537.36"')
browser = webdriver.Chrome(chrome_options=options)
browser.maximize_window()
wait = WebDriverWait(browser,2)#调用Chrome时等待2s再继续

获取源代码

browser.get(url)#访问网站
num = 0
try:
while True:
num += 1
login = browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[3]/button/span/span')#模拟点击按钮查看更多珠宝
login.click()#执行点击
time.sleep(1)#防止被反爬
if num == 20:
break
except:
pass
html = browser.page_source#获取当前页面源代码

注意:大型企业的官方网站基本都有反爬虫策略所以怕被拉黑,停止1s,意思意思~

毕竟薅羊毛可以,但是把羊给薅死就不行了

过滤源代码:

combination = re.findall('<div class="product-legend"><span class="title-with-level product-title century-std size-s"><span class="multiline-text multiline-text--is-china">(.*?)</span>.*?<img src="(.*?)"', '%s'%html, re.S)

一条re.findall 即可过滤出 珠宝介绍和珠宝图片

下载图片:

for i in combination:
i = list(i)#转换为数组
down = i[1]#i[1]为图片链接
save_jpg = requests.get(down)#下载
time.sleep(1)#防止被反爬
print('正在下载:%s'%down)
save = open('F:\\python测试\\data\\迪奥\\%s'%num + '.jpg', 'wb')#储存位置
save.write(save_jpg.content)#写入图片数据
save.close()#关闭

进行Excel编辑:

file = xlsxwriter.Workbook('迪奥.xls')#创建迪奥.xls文件(创建在内存)
table = file.add_worksheet('迪奥')#创建子表'迪奥'
table.write(0, 0, '总体')#在0,0写入文字总体
table.write(0, 1, '名称')
table.write(0, 2, '质量')
table.write(0, 3, '用料')
table.write(0, 4, '图片')

注意:xlswriter框架 写入是按 (纵坐标,横坐标)从0开始 来的,有点反人类。。

a = 0#定义变量,日后好用
b = 4
e = 1
name = re.findall('^(.*?)750', i[0])#过滤出珠宝名称
quality = re.findall('750/1000(.*?)$', i[0])#过滤出珠宝质量
try:
table.write(e,a , '%s'%i[0])#写入
table.write(e,1, '%s'%name[0])
table.write(e,2, '750/1000')
table.write(e,3, '%s'%quality[0])
except:
pass
table.insert_image(e,b, 'F:\\python测试\\data\\迪奥\\%s.jpg'%num)
e += 1
num += 1

完成!

下面是完整的代码:

import os
import re
import time
import request
import requests
import xlsxwriter
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
url = 'https://www.dior.cn/zh_cn/products/search?page=3&query=珠宝'
#url = 'http://www.baidu.com'


chrome="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Mobile Safari/537.36"')
browser = webdriver.Chrome(chrome_options=options)
browser.maximize_window()
wait = WebDriverWait(browser,2)


def get_source(url):
browser.get(url)
num = 0
try:
while True:
print(num)
num += 1
login = browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[3]/button/span/span')
login.click()
time.sleep(1)
if num == 20:
break
except:
pass
html = browser.page_source
return html


def find_combination(html):
combination = re.findall('<div class="product-legend"><span class="title-with-level product-title century-std size-s"><span class="multiline-text multiline-text--is-china">(.*?)</span>.*?<img src="(.*?)"',
return combination

def find_jpg(combination):
jpg = []
txt = []
a = 0
b = 4
e = 1
num = 1
file = xlsxwriter.Workbook('迪奥.xls')
table = file.add_worksheet('迪奥')
table.write(0, 0, '总体')
table.write(0, 1, '名称')
table.write(0, 2, '质量')
table.write(0, 3, '用料')
table.write(0, 4, '图片')

for i in combination:
i = list(i)
down = i[1]
save_jpg = requests.get(down)
time.sleep(1)
print('正在下载:%s'%down)
save = open('F:\\python测试\\data\\迪奥\\%s'%num + '.jpg', 'wb')
save.write(save_jpg.content)
save.close()

name = re.findall('^(.*?)750', i[0])
quality = re.findall('750/1000(.*?)$', i[0])
try:
table.write(e,a , '%s'%i[0])
table.write(e,1, '%s'%name[0])
table.write(e,2, '750/1000')
table.write(e,3, '%s'%quality[0])
except:
pass
table.insert_image(e,b, 'F:\\python测试\\data\\迪奥\\%s.jpg'%num)
e += 1
num += 1
file.close()



find_jpg(find_combination(get_source(url)))
print('下载完成')

打开office 稍加修改格式,即可如图:

GitHub:https://github.com/121812/python

发表评论

电子邮件地址不会被公开。 必填项已用*标注