ython读取当当首页的全部商品分类,首先要使用开发者工具找到全部商品分类所在的层级,
写代码来读取该层级下的文本和超链接。
from __future__ import print_function
import requests
import sys
#reload(sys)
#sys.setdefaultencoding("utf-8")
import importlib
importlib.reload(sys)
from lxml import etree;
#打印全部商品分类
resp=requests.get('http://category.dangdang.com/?ref=www-0-C')
doc_main=etree.HTML(resp.content.decode("gbk"))
for x in doc_main.xpath("//body/div/div/div/ul"):
print(*x.xpath("li/a/text()")+x.xpath("li/a/@href"))
1.商品分类是单独的一项功能,所以商品分类的代码需要新建一个文件/admin/category.php
2.创建商品分类表
3.插入数据
4.着手category.php。/admin/category.php
5.引入模板文件/admin/templates
6.加载模板文件显示/admin/category.php
7.修改首页中左侧的菜单栏中的商品分类的url。/admin/templates/menu.html
8.验证效果
凡是跟商品分类相关的操作都去请求category.php
1.创建一个Category类,专门用来操作sh_category表/includes/Category.class.php
2.通过Category类来获取所有的商品分类/admin/category.php
3.实现getAllCategories方法/includes/Category.class.php
4.在模板中遍历数据并显示/admin/templates/category_list.html
现在数据已经存在,但是商品分类并没有进行真正分类,需要进行分类操作。商品分类没有严格的确定层级的分类,可以无限扩展子分类所以被称之为无限级分类。
5.无限级分类,调用无限级分类,对已经得到的所有商品分类进行处理/admin/category.php
6.实现noLimitCategory方法/includes/Category.class.php
7.显示的时候,按照level层级进行缩进/admin/templates/category_list.html
str_repeat():重复输出某个字符串
无限级分类原理
1.获取添加商品分类的模板文件/admin/templates/category_add.html
2.添加动作,能够加载category_add.html。/admin/catetory.php
3.修改连接能够进入到category.php?act=add。/admin/templates/category_list.html
上面实现进入到添加商品分类的界面,但是商品分类的新增需要指定父级分类,而现在没有。
4.在加载模板之前,需要获取所有的商品分类。/admin/category.php?act=add
5.在对应模板里显示所获得的所有无限级分类。/admin/templates/category_add.html
增加回到商品列表的链接
私信小编01即可获取大量Python学习资料
首先,我们打开首页,输入关键词:女装。↓↓↓
点击找一下,后会跳转到商品页面,如下图所示↓↓↓
这个时候我们就可以看到女装商品分类,和一些推荐商品,
接下来我们不要急着爬这些商品数据,我们要找的是这些商品的分类目录地址。
谷歌浏览器右击检查页面,仔细观察会发现,每个分类的商品都有对应的地址,例如:连衣裙,对应的地址如下
我们进入连衣裙的href标签里面的地址,你会发现页面的标题已经从“女装”变成“女装-连衣裙”了,因为我们在这个页面看到的商品是经过淘宝分类后的,这一页内容只包含“女装-连衣裙”。
通过抓包 我们发现,发现这一页的真实的数据来源地址是:
https://s.1688.com/selloffer/rpc_async_render.jsonp?cps=1&n=y&filtOfferTags=279874&filt=y&keywords=%C5%AE%D7%B0&&categoryId=0&n=y&uniqfield=pic_tag_id&templateConfigName=marketOfferresult&pageSize=60&asyncCount=60&async=true&enableAsync=true&rpcflag=new&_pageName_=market&callback=jQuery172015741463935213496_1555383468519&beginPage=1
联系上下文,仔细观察会发现,这是一个可以拼接的url,大致拼接方式如下:???
url='https://s.1688.com/selloffer/rpc_async_render.jsonp?cps=1&n=y&filtOfferTags=279874&filt=y&keywords='+keywords+'&categoryId='+categoryId+'&n=y&uniqfield=pic_tag_id&templateConfigName=marketOfferresult&pageSize=60&asyncCount=60&async=true&enableAsync=true&rpcflag=new&_pageName_=market&callback=jQuery172015741463935213496_1555383468519&beginPage='+str(i)
其中keywords不难看出是关键词,而且是进行url编码后的,而 i 这个明显是页码数字,categoryId英语好的一眼就知道是“类别ID”
这些参数是从哪来的呢?
回到前面,我们进入“女装-连衣裙”的页面,并查看源码,搜索这些关键词,
找到了:
接下来的事 就简单了,通过填参数拼接url,我们随意可以从女装-连衣裙分类下,获取几十页数据信息,或者从女装-日韩女装分类下获取数据信息。然后通过正则匹配到商品offerid。???
这些offerid代表的就是商品id,例如取出其中一个offerid:556983465623。那么这个商品的完整地址就是:
https://detail.1688.com/offer/556983465623.html
商品的名称、价格、销量、大小参数都可以从这个地址获取到。
下一篇我会教大家如何根据offerid抓取商品详情。
本篇完整代码如下:
???
# encoding: utf-8
"""
本脚本 用于根据关键词“女装”爬取1688全部分类商品的offerid
"""
import requests
import re
import random
from lxml import html
import time
"""获取页面内容"""
def get_html(url):
html=''
for x in range(5):
try:
resp=requests.get(url)
html=resp.text
if len(html) < 1000:
continue
else:
return html
except Exception as e:
print('url {0}, throw exception: {1}'.format(url, e))
html=''
return html
"""从女装首页获取全部的分类地址"""
def category_spider():
# 女装:%C5%AE%D7%B0
url='https://s.1688.com/selloffer/offer_search.htm?keywords=%C5%AE%D7%B0&button_click=top&earseDirect=false&n=y&netType=1%2C11'
htmlstr=get_html(url)
section=html.fromstring(htmlstr)
links=section.xpath("//div[@class='s-widget-flatcat sm-widget-row sm-sn-items-control sm-sn-items-count-d fd-clr']/div[@class='sm-widget-items fd-clr']/ul//a/@href")
return links
"""从数据源中正则匹配商品的offerid"""
def spider(url):
pid_list=list()
htmlstr=get_html(url)
goods_pid=re.findall(r'offerid=.*?(\d+)', htmlstr)
for pid in goods_pid:
pid_list.append(pid)
return pid_list
def main():
# 获取女装商品下的所有分类目录地址:连衣裙、女式T恤、短袖T恤、外贸裙、日韩女装等等
links=category_spider()
# 遍历所有分类
for link in links:
sound=get_html(link)
# 类别ID
categoryId=re.findall(r'"categoryId":"(\d+)"', sound)[0]
# 关键词
keywords=re.findall(r'"keywordsGbk":"(.*?)"', sound)[0]
# 每个类别商品,取10页数据
for i in range(1, 10):
url='https://s.1688.com/selloffer/rpc_async_render.jsonp?cps=1&n=y&filtOfferTags=279874&filt=y&keywords='+keywords+'&categoryId='+categoryId+'&n=y&uniqfield=pic_tag_id&templateConfigName=marketOfferresult&pageSize=60&asyncCount=60&async=true&enableAsync=true&rpcflag=new&_pageName_=market&callback=jQuery172015741463935213496_1555383468519&beginPage='+str(i)
pid_list=spider(url)
print(pid_list)
time.sleep(random.randint(1, 3))
if __name__=='__main__':
main()
代码输出结果展示:
*请认真填写需求信息,我们会在24小时内与您取得联系。