百度图片是Ajax加载的,怎么判断是不是Ajax呢?方法很简单,我们在页面进行某种操作时,网页的链接不会变化,但是内容变了,就可以判定网页内容是Ajax动态加载出来的,例如在浏览百度图片时,鼠标滚轮一直往下滑动,图片会不断加载出来,但是网页的链接并没有变化,百度图片就是Ajax动态加载出来的。
爬取Ajax动态加载的内容一般需要找到它的json接口,在浏览器开发者工具—>Network—>XHR可以找到,如果没有找到就再选择其他的看看。
import requests
from urllib import parse
from uuid import uuid4
import os
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
session=requests.session()
session.headers=headers
num=0
def getPage(url):
page=session.get(url)
print(page.status_code)
# print(page.json())
page.encoding=page.apparent_encoding
data=page.json()['data'] # 列表
for i in data[:-1]: # 因为最后一个是空的,所以取到倒数第二个元素
img_url=i['hoverURL']
print(img_url)
imgDownload(img_url)
# 下载图片
def imgDownload(url):
if not os.path.exists('06_imgs'):
os.makedirs('06_imgs')
global num
try:
content=session.get(url)
with open('06_imgs/{}.jpg'.format(uuid4()),'wb') as f:
for chunk in content.iter_content(225): # 每次下载225字节
if chunk:
f.write(chunk)
num += 1
print(">>>第{}张爬取成功.".format(num))
except:
print(">>>爬取失败.")
if __name__ == '__main__':
# num=0
word=input("请输入关键词:")
pages=input("请输入要爬取的页数,每页30张图片:")
for page in range(int(pages)):
url='https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&word='+parse.quote(word)+'&pn='+str((page+1)*30)
getPage(url)