hello啊,各位小伙伴 ,眨眼间7月份过去了,八月已经悄然来临,不知道八月大家又立了什么样的flag,作为一个低产的公众号运营者,想想都是一阵莫名奇妙的辛酸,每月就三四篇文章,唉…不多说了,在这首先感谢大家对我的持续关注。
今天带来的文章是使用python爬取百度图库的案例,因为我们在处理文章或者寻求灵感的时候,总会用到一些图片,但是查找图片是一个让人觉得繁琐的过程,要么是上下格调不一,要么是主题类目不够清晰,在网页上找的图片还要来回翻阅,多少会有一定的麻烦,还是不如下载到本地直接查看方便的多。
今天小编给大家分享的是,如何使用代码获取百度图库的图片,实现利用关键词搜索进行图片下载的功能。至于百度图库的打开方式,不做过多赘述,不会的小哥请自行百度解决,找到后请输入自己想要搜索的相关关键词,提取下网址的链接,小编搜索的是“图片带字”,可以根据下面的图片看出word携带的参数是我们搜索的内容。
但是我们把网址复制出来后可以明显的看到word的参数是被进行转码过的,所以我们一定要记着对关键词进行转码,至于其他的分析和之前的思路差不多,具体请查看代码中的注释,废话不多说,请看代码:
import re
import urllib
import requests
def get_onepage_urls(onepageurl):
"""获取单个翻页的所有图片的urls+当前翻页的下一翻页的url"""
if not onepageurl:
print('已到最后一页, 结束')
return [], ''
try:
html = requests.get(onepageurl).text
except Exception as e:
print(e)
pic_urls = []
fanye_url = ''
return pic_urls, fanye_url
pic_urls = re.findall('"objURL":"(.*?)",', html, re.S)
fanye_urls = re.findall(re.compile(r'<a href="(.*)" class="n">下一页</a>'), html, flags=0)
fanye_url = 'http://image.baidu.com' + fanye_urls[0] if fanye_urls else ''
return pic_urls, fanye_url
def down_pic(pic_urls):
"""给出图片链接列表, 下载所有图片"""
for i, pic_url in enumerate(pic_urls):
try:
pic = requests.get(pic_url, timeout=15)
string = str(i + 1) + '.jpg'
with open(string, 'wb') as f:
f.write(pic.content)
print('成功下载第%s张图片: %s' % (str(i + 1), str(pic_url)))
except Exception as e:
print('下载第%s张图片时失败: %s' % (str(i + 1), str(pic_url)))
print(e)
continue
if __name__ == '__main__':
keyword = input("请输入搜索关键词:") # 关键词, 改为你想输入的词即可, 相当于在百度图片里搜索一样
url_init_first = r'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1497491098685_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1497491098685%5E00_1519X735&word='
url_init = url_init_first + urllib.parse.quote(keyword, safe='/')
all_pic_urls = []
onepage_urls, fanye_url = get_onepage_urls(url_init)
all_pic_urls.extend(onepage_urls)
fanye_count = 0 # 累计翻页数
n = input("请输入翻页数:")
while fanye_count < int(n):
onepage_urls, fanye_url = get_onepage_urls(fanye_url)
fanye_count += 1
print('第%s页' % fanye_count)
if fanye_url == '' and onepage_urls == []:
break
all_pic_urls.extend(onepage_urls)
down_pic(list(set(all_pic_urls)))