Python爬取京东商城商品大图详解
做为一个爬虫初学者,在做爬取网址图片的练习中以京东网为例爬取商品大图并保存在相应的文件夹
1.导入模块
import urllib.request
import re
2.商品名称填写区域
这里“AJ”只是举个例子,当然也可以输入其他任意商品
keyname="AJ"#输入商品名称
key=urllib.request.quote(keyname)
3.添加报头
添加报头的目的是模拟浏览器去访问目标网页,这里我用的是火狐浏览器,当然谷歌也可以,但是需要改一下报头信息
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
4.分析商品网页
在京东首页先随便搜一个商品,以“男外套“为例子吧:
这是“男外套”第一页的URL:
'''https://search.jd.com/Search?keyword=%E7%94%B7%E5%A4%96%E5%A5%97&enc=utf-8&pvid=7fd9c2174f0b403da73119cfc5fe2f03'''
继续点击第二页、第三页,把对应的URL复制下来进行分析
第二页:
'''https://search.jd.com/Search?keyword=%E7%94%B7%E5%A4%96%E5%A5%97&page=3&s=51&click=0'''
第三页
'''https://search.jd.com/Search?keyword=%E7%94%B7%E5%A4%96%E5%A5%97&page=5&s=101&click=0'''
然后进行分析,在keyword后面更换一下商品名称复制到浏览器中打开,会打开京东商城搜索更换的商品名称的页面。
例如把第三页中的keyword后面的”%E7%94%B7%E5%A4%96%E5%A5%97“这一串字符串换为“女外套”,我们发现商城页面从“男外套”变成了“女外套”并已经进行了搜索
关键问题来了:当前页面只是第一页,怎么使网址变成第二页、第三页、第N页呢。继续分析之前复制三个页面的URL,发现URL中有一个单词page,于是我试着去修改“page=”后面的数字,将3改为7,发现页面跳到了第4页
之前复制的第二个和第三个URL“page=”后面分别是3、5,由于搜索商品的页面默认是第一页,复制下来的URL也跟第二页、第三页差别比较大,于是我试着将“page=”后面的数字改为1,发先页面跳到了第一页;于是我们的URL就可以确定了:
url="https://search.jd.com/Search?keyword="+key+"&wq="+key+"&page="+str(i*2-1);
然后对页面进行访问并读取编码:
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
5.正则表达式的确定
查看搜索商品页面的源代码,在商品搜索界面先随便复制一张商品图的图像地址,复制在文本中,然后选择复制其中的一段(因为全部复制有可能找不到,实际图片地址和页面源代码里面的图片地址的格式可能不太一样),例如我复制任意一个商品的图片地址中的一段在源代码中进行搜索
发现商品图片地址前面的标签是“data-lazy-img”然后再在源代码页面搜索此标签,发现"data-lazy-img"标签后面都是商品图片的图片地址,于是可以设置正则表达式:
pat='data-lazy-img="(.*?)"'
然后再进行:
imagelist=re.compile(pat).findall(data)
6.大图的爬取(之前的图片地址是小图)
先在搜索页面复制一张图片的地址到文本,然后再点进商品,去查看大图,再复制商品图片的地址到文本,进行分析,例如
小图图片地址'''https://img14.360buyimg.com/n7/jfs/t1/112463/24/19126/94054/5f7199a9E0a24e8f5/21931f19ee2f4874.jpg'''
大图图片地址'''https://img14.360buyimg.com/n0/jfs/t1/112463/24/19126/94054/5f7199a9E0a24e8f5/21931f19ee2f4874.jpg'''
从上图片地址分析得到只有一处不一样,那就是/n7和/n0,于是需要把爬取出来的字符串中的“/n7”换为"/n0":
b1=imagelist[j].replace('/n7', '/n0')
注意:爬取的图片地址直接是打不开的,需要在前面加个“http:”
newurl="http:"+b1
以下是此程序的完整代码:
import urllib.request
import re
keyname="AJ"#输入商品名称
key=urllib.request.quote(keyname)
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
for i in range(1,10):
url="https://search.jd.com/Search?keyword="+key+"&wq="+key+"&page="+str(i*2-1);
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
pat='data-lazy-img="(.*?)"'
imagelist=re.compile(pat).findall(data)
for j in range(0,len(imagelist)):
b1=imagelist[j].replace('/n7', '/n0')
print("第"+str(i)+"页第"+str(j)+"张爬取成功")
newurl="http:"+b1
file="E:/新建文件夹/AJ/"+"第"+str(i)+"页第"+str(j)+"张"+".jpg"#file指先在指定文件夹里建立相关的文件夹才能爬取成功
urllib.request.urlretrieve(newurl, filename=file)
结语
作为爬虫初学者,很乐意分享一些简单的小程序,可能有很多描述得不够专业,但是也比较详细了(欢迎指正批评)!