「I.Talk」,是从北师珠信院学生会延伸至微信公众号的特别栏目,针对于IT行业一周之内的时事进行报道。我们将每周一为同学们,报道最新鲜最有趣的新闻资讯,让同学们在学习IT知识之余,了解国内外IT行业潮流形势。
愉(duo)快(shou)的双十一过去了,看到购物网站上琳琅满目的商品,配着漂亮的图片,有没有很想下载下来当做素材呢。京东是我们购物经常去光顾的一个平台,它里面的商品多种多样,其中的商品图片也是应有尽有,今天小编呢就给大家带来一个京东商品图片的简单爬虫。
开发工具及环境搭建
多干货分享加python编程语言学习QQ群 515267276
Python版本:3.6.4
开发环境:pycharm 64位
浏览器:Chrome
相关模块:requests、urllib.request、lxml、os、bs4
安装:pip 安装即可
爬取 url 地址:www.jd.com 如下图
现在我们假设要爬取手机的图片,我们在搜索框内输入手机,点击搜索后的页面如下图。
此时的 url 如下图所示
可见其中有 ‘keyword=手机‘ 以及 ‘wq=手机’关键字,说明请求使用的是 get 方法现在我们修改 url,去掉一些字段后如下图所示。
页面可以正常显示
我们来点击第二页,可以看到 url 多了一个‘page=3’的字段,点击第三页,其中的数字变成了5,由此说明它的 url 每一页的字段为单数,我们在删减 url 可正常显示。
如下图
所以说,我们可以通过改变关键字,来确定想爬取的商品图片。确定了 url 后,我们来构造 url 列表,小编我只爬取了了前10页,有600张图,你也可以自定义,但太多的话会受到京东的反爬。代码如下,先输入一个 commodity 来得到想要爬取的商品名的关键字;然后用列表解析构造前10页的 urls。
我们先定义一个图片下路径供后面使用
构造请求头,在浏览器中按下 F12 打开开发者工具,点击‘Network’,下面会出现一堆文件,点击第一个文件,右面会出现一些信息,选中‘Headers’找到其中的‘user-agent’,这就是请求头,模拟浏览器访问的参数。
模块导入,如下图
多干货分享加python编程语言学习QQ群 515267276
那现在我们可以来写爬取的函数了,如下图
现在来解释一下。
传进去的是每一页的 url 和计数器 count,用来记数爬到了第几张图片。
第一二行,请求 url,并用 bs4 库中的 BeautifulSoup() 类来获得 HTML 源码并用 ‘lxml’ 解析。
第三行用 select 选择器获得所有图片在 HTML 源码中的位置组成一个列表,在图片那里右键‘检查元素‘,在右边会弹出高亮代码,在那里在右键‘Copy’-‘select’,就的到了 select 选择器路径。
!!注意,下面是一个有点坑的问题!!
获得图片的 HTML 源码所在的后,就要下载了,可我运行调式,发现获得的图片 url 的属性与源码中显示的属性不一样,导致没有结果
在源码中的显示的属性,如下
图片对应的 url 的为属性为‘src’,经过断点调试发现,爬下来的真实属性为‘source-data-lazy-img’。
如下图
!!!要用此属性才能获取图片的 url 去下载!!!
现在开始下载,首先用了,一个异常捕获,防止在下载中有图片不能下载而导致程序停止。
用循环提取列表中的每一个图片的 url ,给图片命名。
用 urllib.request.urlretrieve(img_url,filename=img_name) 下载,第一个参数是图片的 url,第二个是图片的下载路径的名字
最后返回计数器
再来定义一个,创建下载路径的文件夹的函数,这里就不多解释,如下图
最后主函数,如下
其中要想调用创建文件夹的函数,创建保存的文件,在开始循环,但在调用爬取函数之前,要先把 url 的编码格式转换一下,否则会有问题。
多干货分享加python编程语言学习QQ群 515267276
最终成果