京东爬虫案例:
大致分析:
产品的每一页的请求接口都是一样的 只是传递的参数不一样,也就是后边的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 版本写的