鱼C论坛

 找回密码
 立即注册
查看: 7003|回复: 21

[技术交流] 26 淘宝商品图片爬虫实战1

[复制链接]
发表于 2017-6-24 23:19:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 和vvv 于 2017-6-26 19:40 编辑
26 淘宝商品图片爬虫实战1

一、需求分析

(1)打开淘宝官网(https://www.taobao.com/),搜索商品“图书”。可以看到有许多配有图片的商品,我们的目的就是把这些图片爬取下来,并保存到本地文件夹。
(2)拖到最后,发可以翻页。对的,爬虫还要实现自动翻页的功能
(3)这只是图书商品的搜索结果,而我们希望可以根据自己的需要进行。因此,爬虫还应实现对不同商品的搜索

二、网站分析与初步编写

(1)首先实现对不同商品的搜索打开淘宝首页,搜搜“图书”,可以发现地址栏url为:
https://s.taobao.com/search?q=%E5%9B%BE%E4%B9%A6&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170624
对其进行精简之后,可以是:
https://s.taobao.com/search?q=%E5%9B%BE%E4%B9%A6
然后在搜索另外不同的商品,如“篮球”。其url为:
https://s.taobao.com/search?q=%E7%AF%AE%E7%90%83&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20170624&ie=utf8
精简之后:
https://s.taobao.com/search?q=%E7%AF%AE%E7%90%83
加%的那一串是中文经过转码之后的结果。于是,到这个地方,我们就可以总结出规律。如果你还不放心,可以多试几遍。
https://s.taobao.com/search?q=关键词
我们把淘宝的搜索结果封装成一个函数,方便调用。
import urllib.request
import random

#用户代理池。为什么不用IP代理呢?由于没有稳定的IP(需付费)
def ua():
    uapools = [
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon/3.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ;  QIHU 360EE)",
    ]
    thisua = random.choice(uapools)
    print(thisua)
    headers = ("User-Agent",thisua)
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    urllib.request.install_opener(opener)

#淘宝搜索结果,传入参数搜索商品名称keyname
def crawl(keyname):
    #调用用户代理池函数
    ua()
    #对关键词进行转码
    key = urllib.request.quote(keyname)
    url = "https://s.taobao.com/search?q="+key
    data = urllib.request.urlopen(url).read().decode('utf-8','ignore')
    return data

rst = crawl("图书")
print(rst[:1000])
结果(显然是成功了的):
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon/3.0)



<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="renderer" content="webkit">
    <meta name="data-spm" content="a230r">
    <link rel="dns-prefetch" href="//g.alicdn.com">
    <link rel="dns-prefetch" href="//assets.alicdn.com">
    <link rel="dns-prefetch" href="//img.alicdn.com">
    <link rel="dns-prefetch" href="//g-search1.alicdn.com">
    <link rel="dns-prefetch" href="//g-search2.alicdn.com">
    <link rel="dns-prefetch" href="//g-search3.alicdn.com">
    <link rel="dns-prefetch" href="//g-search4.alicdn.com">
    <link rel="dns-prefetch" href="//gtms01.alicdn.com">
    <link rel="dns-prefetch" href="//gtms02.alicdn.com">
    <link rel="dns-prefetch" href="//gtms03.alicdn.com">
    <link rel="dns-prefetch" href="//gtms04.alicdn.com">
    <meta name="description" content="淘宝搜索是最智能的商品搜索引擎,通过大数据的运营,准确的理解商品与用户,提供精准的个性化搜索体验。">
            <meta name="keywords" content="图书,图书_淘宝网,图书_淘宝
(2)提取某一商品搜索结果一页的图片链接(以图书的搜索结果为例)

1、随便找一张商品图片,右键“复制图片网址”。在新标签页打开,但是图很小,显然不是我们要的。这是我复制的:
https://gsearch1.alicdn.com/img/bao/uploaded/i4/i1/792509283/TB2s2fjqohnpuFjSZFpXXcpuXXa_!!792509283.jpg_230x230.jpg_.webp
而且这也不是常见的图片链接。我们把最后的结尾删掉:
https://gsearch1.alicdn.com/img/bao/uploaded/i4/i1/792509283/TB2s2fjqohnpuFjSZFpXXcpuXXa_!!792509283.jpg_230x230.jpg
这是常见的图片链接。但打开之后,还是小图。于是我们想,把“
_230x230.jpg”删掉会如何。结果是出乎意料的好,其效果就是我们要的效果。
https://gsearch1.alicdn.com/img/bao/uploaded/i4/i1/792509283/TB2s2fjqohnpuFjSZFpXXcpuXXa_!!792509283.jpg
做这部分分析时,需要的就是经验了。

2、右键“查看源文件”,按“Ctrl+F”搜索。把刚才得到的图片url粘贴进行炒找。如果找不到,先不要慌从网址的前面开始删除,慢慢的找。如果还是没有找到,换一张图片的网址试试。这一步必须要有耐心,细心,次数做多了,很快就会找到了。把链接删到一定程度后,会在源码中找到东西。
无标题.png

从格式上可以看出这是图片url,打开它,发现正是刚才那张图片,而且质量也是可以的。

3、接下来在搜索 "pic_url": ,也就是刚才图片链接的前方的字段。可以发现有36个结果,虽然不是全部的结果,但也够了。打开链接尝试查看,基本都能打开。于是提取图片链接的正则表达式可以这样写:
pat ='"pic_url":"\/(.*?)"'
其中的\/,第一个\是转义符,使之能够匹配/。

4、将正则表达式与上面的代码联系起来:
游客,如果您要查看本帖隐藏内容请回复

结果(只列举前几条):
http://gsearch1.alicdn.com/img/bao/uploaded/i4/imgextra/i1/106310339136250833/TB2zkPdagxlpuFjy0FoXXa.lXXa_!!0-saturn_solar.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i4/TB1S3pFPFXXXXXjXFXXXXXXXXXX_!!0-item_pic.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i4/TB1jWdaRVXXXXboXpXXXXXXXXXX_!!0-item_pic.jpg
http://g-search2.alicdn.com/img/bao/uploaded/i4/i2/TB1Mk_rJVXXXXXkXpXXXXXXXXXX_!!0-item_pic.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i3/T1q9lFFkNcXXXXXXXX_!!0-item_pic.jpg
http://gsearch3.alicdn.com/img/bao/uploaded/i4/i4/1655732615/TB2iM64kItnpuFjSZFKXXalFFXa_!!1655732615.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i4/TB1zO8rQpXXXXamXFXXXXXXXXXX_!!0-item_pic.jpg
http://g-search2.alicdn.com/img/bao/uploaded/i4/i3/TB1MzrkJVXXXXcrXpXXXXXXXXXX_!!0-item_pic.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i2/TB13Z.uJVXXXXaSXpXXXXXXXXXX_!!0-item_pic.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i2/TB1D7.KMVXXXXaoXXXXXXXXXXXX_!!0-item_pic.jpg
http://g-search2.alicdn.com/img/bao/uploaded/i4/i4/TB1ur5ZLFXXXXc3XFXXXXXXXXXX_!!0-item_pic.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i3/TB1krFGQpXXXXXxaXXXXXXXXXXX_!!0-item_pic.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i3/TB1Lv33QXXXXXb2aXXXXXXXXXXX_!!2-item_pic.png
http://g-search2.alicdn.com/img/bao/uploaded/i4/i1/15618020612114011/T1FjpqXCFXXXXXXXXX_!!0-item_pic.jpg
http://g-search3.alicdn.com/img/bao/uploaded/i4/i3/TB1txztHFXXXXabXpXXXXXXXXXX_!!0-item_pic.jpg
打开这些链接,刚好是我们所要的结果。


于是,我们提取1页的图片的链接就完成了。总结一下,urllib库和正则表达式的利用。其中找寻图片链接需要多多练习,才会找的更快。

(3)将图片链接以图片形式下载到本地:
import urllib.request
url = "http://g-search2.alicdn.com/img/bao/uploaded/i4/i4/TB17b4jQpXXXXbAXpXXXXXXXXXX_!!0-item_pic.jpg"
urllib.request.urlretrieve(url,"f:/1."+url.split(".")[-1])
其中 url.split(".")[-1] 是获取文件扩展名。打开对应文件夹,可以发现图片下载成功。

最后剩下的翻页功能和整个项目的完整实现将在下一笔记中说。


如果大家觉得还可以的话,可以到我的淘专辑(http://bbs.fishc.com/forum.php?mod=collection&action=view&ctid=742&fromop=my)看看更多相关的笔记。

评分

参与人数 1鱼币 +8 收起 理由
小甲鱼 + 8 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-25 07:49:14 | 显示全部楼层
厉害~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-25 19:19:03 | 显示全部楼层
收益了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-25 19:19:52 | 显示全部楼层
收益了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 15:42:11 | 显示全部楼层
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-27 16:23:43 | 显示全部楼层
感觉没多少人对爬虫感兴趣啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-4 10:45:31 | 显示全部楼层
hahahha
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-16 16:17:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-20 13:33:00 | 显示全部楼层
看看~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-27 10:59:43 | 显示全部楼层
感谢老铁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-9 10:04:57 | 显示全部楼层
这个可以有啊,多谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-13 15:48:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-15 10:25:07 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-16 15:54:09 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-17 09:50:51 | 显示全部楼层
有个问题,淘宝貌似是动态加载的,用正则或者xpath应该都是匹配不到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-17 11:00:54 | 显示全部楼层
本帖最后由 和vvv 于 2017-10-17 11:05 编辑

如果在网页源码里找不到的话,只有进行抓包分析(抓取动态加载的网页)进行尝试了。
我找了一下,还是能找到的:
无标题.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-10 13:10:03 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-26 22:48:13 | 显示全部楼层
学习

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-13 23:12:23 | 显示全部楼层
看看,学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-5 18:00:13 From FishC Mobile | 显示全部楼层

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表