本篇博客我们将爬取百度图片,输入搜索词,爬取与搜索词相关的图片。
首先打开搜狗图片https://pic.sogou.com/,比如搜索"猫",此时的URL如下:
如果仅凭借URL来爬取的话,URL中需要体现出搜索词信息以及页数信息,所以我们需要使用下面这个URL(至于这个URL是怎么得到的,目前我也不清楚,先照搬):
https://pic.sogou.com/pics?query={}&mode=1&start={}&reqType=ajax&reqFrom=result&tn=0
其中第一个{}替换为搜索词,第二个搜索词替换为页数信息。
首先搭建程序主体框架:
import time
import requests
import os
from requests import RequestException
import json
def get_page(url):
pass
def parse_page(html, count, word):
pass
if __name__ == '__main__':
word = '猫' # 关键词
page = 10 # 爬取的页数
count = 0 #图片计数
if not os.path.exists(word):
os.makedirs(word) # 建目录
for i in range(page):
url = 'https://pic.sogou.com/pics?query={}&mode=1&start={}&reqType=ajax&reqFrom=result&tn=0'.format(word,i*48)
# 发送请求、获取响应
html = get_page(url)
# 解析响应 数据存储
count = parse_page(html, count, word)
time.sleep(1)
发送请求获取响应,编写get_page(url)函数:
def get_page(url):
try:
# 添加User-Agent,放在headers中,伪装成浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
response.encoding = response.apparent_encoding
return response
return None
except RequestException:
return None
注意和之前不同,这里指返回response,因为在解析首页时,我们需要的是response.text;当获取图片URL爬取保存图片时,需要的是response.content。返回response,两次请求可以通用这个函数。
打开上面的链接,会发现他返回的是json格式的数据:
所有的图片信息都在items下,上图蓝色阴影代表一张图片的信息,内部都是由一些键值对组成,我们关心的是pic_url字段,他的值是图片真正的链接。所以,我们要先把图片的pic_url解析出来,然后再进行图片爬取,和保存。
解析响应,解析json数据,提取middleURL并保存,然后爬取pic_url,保存图片:
def parse_page(html, count, word):
html = html.text
if html:
p = json.loads(html)['items'] # 转为json格式 提取items字段
print(len(p)) # 图片数
for i in p[:-1]: # [0:5]前5张
print(i['pic_url'])
count = count + 1
# 数据保存
with open(word + '/' + word + '_url_搜狗.txt', 'a', encoding='utf-8') as f:
f.write(i['pic_url'] + '\n')
pic = get_page(i['pic_url'])
if pic:
with open(word + '/' + '搜狗_'+str(count) + '.jpg', 'wb') as f:
f.write(pic.content)
time.sleep(1)
return count
完整代码:
import time
import requests
import os
from requests import RequestException
import json
def get_page(url):
try:
# 添加User-Agent,放在headers中,伪装成浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
response.encoding = response.apparent_encoding
return response
return None
except RequestException:
return None
def parse_page(html, count, word):
html = html.text
if html:
p = json.loads(html)['items'] # 转为json格式 提取items字段
print(len(p)) # 图片数
for i in p[:-1]: # [0:5]前5张
print(i['pic_url'])
count = count + 1
# 数据保存
with open(word + '/' + word + '_url_搜狗.txt', 'a', encoding='utf-8') as f:
f.write(i['pic_url'] + '\n')
pic = get_page(i['pic_url'])
if pic:
with open(word + '/' + '搜狗_'+str(count) + '.jpg', 'wb') as f:
f.write(pic.content)
time.sleep(1)
return count
if __name__ == '__main__':
word = '猫' # 关键词
page = 10 # 爬取的页数
count = 0 #图片计数
if not os.path.exists(word):
os.makedirs(word) # 建目录
for i in range(page):
url = 'https://pic.sogou.com/pics?query={}&mode=1&start={}&reqType=ajax&reqFrom=result&tn=0'.format(word,i*48)
# 发送请求、获取响应
html = get_page(url)
# 解析响应 数据存储
count = parse_page(html, count, word)
time.sleep(1)