爬虫案例---Python2X版本抓取京东手机页面的图片

京东爬虫案例:

大致分析:


产品的每一页的请求接口都是一样的 只是传递的参数不一样,也就是后边的page  ,1对应第一页

https://list.jd.com/list.html?cat=9987,653,655&page=1

由此可以通过for循环的方式,先把所有的内容请求下来,然后通过正则表达式去爬取每一页的图片。

这里用到的类库是 re urllib2 urllib 


正则表达式要写两部分


第一部分:用正则表达式匹配源代码中的最外层的div块

查看源代码可知: 是被<div id="plist"> 这个 div块包裹住 如下图:


而离他最近的结束符是 <div class="page clearfix"> 如下图:


由此可以写正则表达式   (运用非贪婪模式 匹配 这两个div块之间的所有内容)

'<div id="plist".+?<div class="page clearfix">'



第二部分:运用正则表达式获取其中每个条目的 图片链接

查看源码图片的格式 (由于整体的项目可能不是一个人敲的,所以,产看源码发现 图片链接格式出现了2种情况 ,必须要右键,查看源代码然后按照规则写正则表达式,不要通过console 看规则写表达式,因为经过浏览器渲染后,console里的代码 可能会被js 改变,会导致没有符合规则的条目,返回None)

这种是最多的情况 如下图:


正则表达式

'<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)">'



还有很少一部分这种情况如下图:



正则表达式:

'<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'



整体其实就是先把所有内容抓取下来  然后写两个正则表达式,先匹配外层的div块, 获取到内容后 在匹配div块里边的条目,最终获得图片的链接保存到本地


最终代码:

import re
import urllib
import urllib2

def reImage(htmlInfo,page):
	try:
		urls = re.findall(r'''<div id="plist".+?<div class="page clearfix">''', htmlInfo, re.I | re.S | re.M)
		print len(urls)
		pat2 = '<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'
		imagelist = re.compile(pat2).findall(urls[0])
		
		print len(imagelist)
		x=1
		for imageurl in imagelist:
			imagename="jdImage"+str(page)+str(1)+".jpg"
			imageurl="http://"+imageurl
			urllib.urlretrieve(imageurl,filename=imagename)
			x+=1
	except Exception as e:
		print e
#先把所有的内容请求下来,然后进行正则表达式pi pe
def pImage(url,page):
	headers=(
	'User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
	)
	opener=urllib2.build_opener()
	opener.addheaders=[headers]
	response=opener.open(url).read()
	
	htmlInfo=str(response)
	reImage(htmlInfo,page)

if __name__=='__main__':
	help(re)
	url='https://list.jd.com/list.html?cat=9987,653,655&page='
	for i in range(1,4): #前3页的图片
		url=url+str(i)
		pImage(url,i) 


参考韦玮的《精通Python网络爬虫核心技术,框架与项目实战》

原作者是用Python3版本写的,本次是用Python2 版本写的







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值