首页 > 墨香

python 根据关键词爬取1688商品数据(完整案例)

moxiang 墨香 2020-09-03 11:11:18

环境:python3.6

目的:根据关键词在淘宝1688平台上搜索商品,并将商品的pid等信息抓取下来。

 

首先,我们打开首页https://s.1688.com/,输入关键词:女装。↓↓↓???

 

 

 

点击找一下,后会跳转到商品页面,如下图所示↓↓↓???

 

 

这个时候我们就可以看到女装商品分类,和一些推荐商品,

接下来我们不要急着爬这些商品数据,我们要找的是这些商品的分类目录地址。

谷歌浏览器右击检查页面,仔细观察会发现,每个分类的商品都有对应的地址,例如:连衣裙,对应的地址如下???

 

 

我们进入连衣裙的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()

 

代码输出结果展示:


本文链接:https://blog.csdn.net/t8116189520/article/details/94733864

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
本文地址:/moxiang/1217.html

留言与评论(共有 0 条评论)
   
验证码:

潘少俊衡

| 桂ICP备2023010378号-4

Powered By EmpireCMS

爱享小站

中德益农

谷姐神农

环亚肥料

使用手机软件扫描微信二维码

关注我们可获取更多热点资讯

感谢潘少俊衡友情技术支持