爬取1688某店铺内所有商品链接、最低批发价格、商品名称
本文通过某1688店铺的链接,然后爬取该店铺所有商品的基本信息,包括商品链接、最低批发价格及商品的全名。
之后还通过简单的正则表达式从商品全名中解析出商品的货号。
最后将商品信息导入excel中。
本文中未解决的问题是:
- 如何从每个商品链接中爬取详细的商品信息。用selenium爬出的网页一直是乱码,requests包根本啥都爬不出来。是否有其他的包可以用?
- 1688上某些商品的价格信息被锁,需要登陆才能获取,如何登陆呢?
- 1688店铺链接中,商品的排序是否会发生变化。本文假设没有变化。
第一步:导入所需要的包
from selenium import webdriver # 需要驱动文件 selenium包用于爬虫
import pandas as pd # 用于导出数据
import json # json用于解析爬取的网页
第二步:定义selenium爬虫的option和driver
option=webdriver.ChromeOptions()
option.add_argument('--headless') # 爬取时不自动弹出浏览器
driver=webdriver.Chrome(options=option,executable_path="chromedriver.exe") # executable_path为驱动文件路径
第三步:定义存储商品信息的list
urls = [] # 商品链接
descs = [] # 商品全名
prices = [] # 商品最低批发价格
第四步:找到店铺链接和商品信息的xpath
找到想要爬虫的1688店铺,进入店铺主页
图1
注意上图这个链接只能爬取第一页,还要下拉,随意点一页,然后找到新的链接。
楼主随意点了第三页,发现链接明显变长了。
https://mulan520.1688.com/page/offerlist.htm?spm=a2615.7691456.autotrace-paginator.4.446b1a7487NZNG&tradenumFilter=false&sampleFilter=false&sellerRecommendFilter=false&videoFilter=false&mixFilter=false&privateFilter=false&mobileOfferFilter=%24mobileOfferFilter&groupFilter=false&sortType=tradenumdown&pageNum=3#search-bar
链接最末有一个pageNum=3,也就说我们要如果想爬任意一页,只要将数字换成对应的页码即可
下面是找到展示的每个商品的xpath。
选中价格信息,或者商品名称信息,右击检查
图三
按照上图的方法直接复制xpath即可,以下每件商品的xpath也可以按照类似的方法操作。
更为稳妥的爬虫方法是手动找到几个关键的xpath节点,对于每个节点进行测试,如果不能爬取就报相应的错误。
但是本人水平不行,就只能这样简单粗暴一下了。
第五步:写代码
xpath_all = '//*[@id="search-bar"]/div[2]/div/div/div/ul'
for j in range(1,16):
tongpei = 'https://mulan520.1688.com/page/offerlist.htm?spm=a2615.7691456.autotrace-paginator.4.446b1a7487NZNG&tradenumFilter=false&\
sampleFilter=false&sellerRecommendFilter=false&videoFilter=false&mixFilter=false\
&privateFilter=false&mobileOfferFilter=%24mobileOfferFilter&groupFilter=false&sortType=tradenumdown&pageNum={}#search-bar'.format(j)
driver.get(url = tongpei)
req = driver.find_element_by_xpath(xpath_all)
for i in range(1,17):
item_url = req.find_element_by_xpath('li[{}]/div/a'.format(str(i))).get_attribute('href')
full_desc = req.find_element_by_xpath('li[{}]/div/a'.format(str(i))).get_attribute('title')
try:
price = req.find_element_by_xpath('li[{}]/div[3]/div/em'.format(str(i))).text
except:
price = 'unknown'
urls.append(item_url)
descs.append(full_desc)
prices.append(price)
# 从商品名称中获取货号(如何有的话
import re
ids = []
for name in descs:
se = re.search(r'[-a-z0-9#]+',name, flags=re.IGNORECASE)
try:
shid = se.group(0)
except:
shid = "未找到"
ids.append(shid)
# 创建dataframe
di = {'网页链接': urls, '商品名称': descs, '价格': prices}
final_table = pd.DataFrame(data = di)
最后一步:导出dataframe到excel
final_table.to_excel("hh.xlsx", encoding="utf_8_sig", sheet_name='Sheet1', header=None)