目的:获取京东手机页面的图片
1、打开京东首页(www.jd.com),选择对应的”手机/运营商/数码”分类,并进入“手机”子分类
链接地址:https://list.jd.com/list.html?cat=9987,653,655&page=1
分析网页源码:找到对应的图片代码段:
思路:
1、爬取网页
2、然后根据正则爬取出 关键内容
3、根据关键内容 再用正则匹配出 图片地址
4、存到服务器将图片
源代码:
import urllib.request
import re
import urllib.error
def craw(url, page):
html1 = urllib.request.urlopen(url).read()
html1 = str(html1) # 如果不转为str 则会报TypeError: cannot use a string pattern on a bytes-like object
# 先把所有图片部分的数据全部取出
pat1 = '<div id="plist".+?<div class="clr"' # 注意单双引号
result1 = re.compile(pat1).findall(html1)
if result1:
result1 = result1[0]
# 京东图片加载时首先加载8张,然后的图片为懒加载所以要获取两次图片
# 根据源码写出对应图片链接地址的正则表达式
pat2 = '<img width="220" height="220" data-img="1" src="//(.+?\.jpg)"'
pat3 = '<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)"' # 懒加载图片正则
imagelist = re.compile(pat2).findall(result1) # 常加载的图片
imagelist1 = re.compile(pat3).findall(result1) # 懒加载的图片
imagelist = imagelist + imagelist1 # 数组合并 将所有图片合并
x = 1
for imageurl in imagelist:
# 对所存的图片进行命名
imagename = "/home/zyb/crawler/myweb/part6/img1/"+str(page)+str(x)+".jpg"
# 图片地址
imageurl = "http://"+imageurl
try:
# 获取图片并保存
urllib.request.urlretrieve(imageurl, filename=imagename)
except urllib.error.URLError as e:
if hasattr(e, "code"): # 使用hasattr函数判断是否有这些属性
x += 1
if hasattr(e, "reason"):
x += 1
x += 1
print("爬取成功")
else:
print("爬取失败,未获取内容")
for i in range(1, 2):
url = "https://list.jd.com/list.html?cat=9987,653,655&page="+str(i)
craw(url, i)
最终结果: