马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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粘贴进行炒找。如果找不到,先不要慌。从网址的前面开始删除,慢慢的找。如果还是没有找到,换一张图片的网址试试。这一步必须要有耐心,细心,次数做多了,很快就会找到了。把链接删到一定程度后,会在源码中找到东西。
从格式上可以看出这是图片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)看看更多相关的笔记。 |