简单讲解下python爬取百度图片的方法还有一些小坑(ps:我是搞.net的所以python只是新手讲错勿怪,注意:系统是windows下的)
首先讲下对百度图片上请求的分析:这里我引用下别人的博客,他已经讲的非常的详细了我就讲下需要注意的地方
先把坑列一个列表:
- 编码
- 路径(百度上的反爬虫和src欺骗)
- econdURL编码
编码
老手就绕过吧,对于入门的新手我还是讲一讲对于python编码,在windows下python是默认不支持中文的,因为python默认的是asci格式处理的然而这个格式是没有中文的,所以当我们要百度上爬取一个图片我们写入关键词是中文的时候就会在中文的地方先报错。如果我们的路径是和要搜索的关键词是相关的那么必须要将中文的关键词编码: KeyWord.decode('utf-8')这样子。还有一个很重要的事情,先将python文件用记事本方式打开然后选着utf-8的格式另存为然后替换源文件,这样子保证文件的编码是utf-8.
路径
百度图片上的路径是假的,这个如果直接复制路径在浏览器上打开那是可以访问图片的但是如果我们用urllib.urlretrieve()方法去下载这个图片那么下载到本地的图片就是无法打开的是错误的图片文件。这个就是个坑爹。正的路径它放在li中而不是img标签的src中。当然这里不是我们关心的,我们采取的方式是请求百度的json数据然后解析图片的json中url然后下载,但是这个其中也有很多欺骗。![这个是我们在谷歌浏览器的network上看到的请求路径](https://img-blog.csdn.net/20170217221722026?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29sb3VtaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后我们将路径拿下来我们只取到host后面的我们自己组装,![这个就是url后面的参数我们按照这个格式将参数自己组装起来就可以请求了。](https://img-blog.csdn.net/20170217221903794?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29sb3VtaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后讲一下这其中的坑爹的地方,我们明显可以看到这个url不加参数应该是http://image.baidu.com/search/acjson应该是这个,然后当我们将参数配置好开始请求的时候发现请求过来的数据都是错误的都是一些无法打开的图片。其实这个地方应该是https://image.baidu.com/search/acjson
这样的才是正确的地址。(当然具体的我没有研究)
最后将这个改为就好了
econdURL
我们在参数中要用到的关键词就是需要用这个进行编码的,然后我们key = urllib.quote('哈士奇')对关键词进行编码就OK了
代码
`#-- coding:utf-8 --
import os
import sys
import requests
import socket
·#设置超时时间
socket.setdefaulttimeout(10)
import urllib2
import urllib
·#搜索关键字
KeyWord = “哈士奇”
·#设置图片文件保存
DownloadPath = os.path.abspath(‘..’) + ‘/pic/’ + KeyWord.decode(‘utf-8’) + ‘/’
·#图片的数量
PageNum = 60
EveryPageImgNum = 30
NowDownloadImgPos = 0
def Request(param):
global NowDownloadImgPos
isSuccess = True
#请求的地址
url = “https://image.baidu.com/search/acjson”
#请求头
headers = {
#”referer” : “https://image.baidu.com/search/index“,
“accept” : “text/plain, /; q=0.01”,
“accept-encoding” : “gzip”,
#”Content-Type” : “application/json”,
“user-agent” : “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36”,
}
·#对请求路径进行组装
url = CombieURL(url, param)
print “TheURL—–>:” + url
·#开始请求
response = requests.get(url, headers = headers)
#获取路径所在的json
json = response.json()[‘data’]
for i in range(0,len(json)):
try:
downloadimgurl = json[i][‘thumbURL’]
exPath,exName = os.path.splitext(downloadimgurl)
localimgurl = DownloadPath + ‘pic_hashiqi_Pos’ + str(NowDownloadImgPos) + exName
urllib.urlretrieve(downloadimgurl, localimgurl)
isSuccess = True
NowDownloadImgPos += 1
print ‘[Success] : Download the Img num is ’ + str(NowDownloadImgPos) + ‘—–’ + ‘ImgUrl: ’ + downloadimgurl
except Exception,e:
if isSuccess == True:
NowDownloadImgPos += 1
isSuccess = False
print ‘[Error] : Exception —–> ’ + str(Exception) + ‘&&&& e —–> ’ + str(e)
return
·#组装URL
def CombieURL(url,params):
url = url + ‘?’
length = len(params)
nownum = 0
for nownum in range(0, length):
url = url + params[nownum][0] + “=” + params[nownum][1]
if nownum != length:
url = url + “&”
else:
break
return url
·#组装参数和查询图片
def Search():
key = urllib.quote(‘哈士奇’)
#key = “%E5%93%88%E5%A3%AB%E5%A5%87”
newparams = [
[‘tn’ , ‘resultjson_com’],
[‘ipn’ , ‘rj’],
[‘ct’ , ‘201326592’],
[‘is’ , ”],
[‘fp’ , ‘result’],
[‘queryWord’ , key],
[‘cl’ , ‘2’],
[‘lm’ , ‘-1’],
[‘ie’ , ‘utf-8’],
[‘oe’ , ‘utf-8’],
[‘adpicid’ , ”],
[‘st’ , ”],
[‘z’ , ”],
[‘ic’ , ”],
[‘word’ , key],
[’s’ , ”],
[‘se’ , ”],
[‘tab’ , ”],
[‘width’ , ”],
[‘height’ , ”],
[‘face’, ”],
[‘istype’, ”],
[‘qc’, ”],
[‘nc’, ”],
[‘fr’, ”],
[‘pn’, str(PageNum)],
[‘rn’, str(EveryPageImgNum)],
[‘gsm’,’5a’],
[‘1487250380474’, ”]
]
Request(newparams)
if name == ‘main‘:
print ‘[Debug] : DownLoad Start: —>DownLoadPath—>’ + DownloadPath
#检查路径是否存在如果不存在就创建
if os.path.exists(DownloadPath) == False:
os.mkdir(DownloadPath)
Search()
print ‘[Debug] : Download Complete’
`
ps: 由于python注释和CSDN编译器#冲突了你们自行看着改一下