目标网站是http://www.netbian.com。
python版本为3.7,使用的库有requests、pyquery、pyquery,如果有缺少可以使用pip install 缺少的库
来安装。
import requests
from pyquery import PyQuery
import time
首先打开网站来分析:打开目标网站,按F12打开源码,检查图片元素
发现图片元素是在div class=list下ul下li的img。下面来写爬取的代码:
首先构建headers信息
没有这个属性有的网站可能会无法爬取。
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
然后就是获取网站的源码
def start_request(url): #获取目标网站的源码
r = requests.get(url, headers=headers, proxies=proxies) #此处proxies参数为代理IP,可以去掉
r.encoding = 'GBK' #在F12页面看网站的头信息,发现是,
# 就是GBK编码,如果不设置就会乱码
html = r.text
return html
这个网站的编码格式时gbk,所以设置GBK格式,否则会乱码
再然后就是解析网站,获得图片信息了
def parse(text, times): #将网站的源码解析
doc = PyQuery(text) #使用pyquery库的PyQuery
images = doc('div.list ul li img').items() #根据开始的分析,找到img图片的位置
x = 1 + times*18 #由于每页有18个图片,因此计数时设置参数
for image in images:
img_url = image.attr('src') # 获取每一张图片的链接
img = requests.get(img_url, headers=headers, proxies=proxies).content # 获得每张图片的二进制内容
with open(str(x)+'.jpg', 'wb') as f: #将图片的二进制内容写入硬盘,这里用'wb'
f.write(img)
time.sleep(0.1) #设置短暂时间,防止被禁
print("正在下载第{}张图片".format(x))
x += 1
print("第{}页写入完成".format(times+5))
这里我们爬取多页的图片,我们前面获取网站源码就是获取的每一个页面(第一页)的源码,如果要爬取下一个页面(第二页),那么就需要传入下一个页面的url
main方法
def main(x):
url = "http://www.netbian.com/index_" + str(x) + ".htm" #写网页的url
text = start_request(url)
parse(text, times=x-2)
if __name__ == "__main__": #设置循环次数即爬去的页数
for i in range(5, 100): #从第五页开始爬取
main(x = i)
获得多个页面url的方法和img是相同的——观察。我们在第一页可能看不出来,那么看第二页,第三页的网址
发现规律了吧?相信你这时候再看main函数的第一句获取url的代码就明白了。
将以上代码连起来就能运行了(保存图片的位置就是当前项目的路径的位置,也可以自行设置)
这就是爬取的结果了。
下面来介绍一个比较有意思的库——photomosaic
如果没有的话可以使用pip install photomosaic
来安装
先看效果图
代码很简单,只有四行
image = photomosaic.imread("basketball.jpg") #我们要合成的图片模板,
# 位置就是当前项目的路径(也是刚才爬取图片的路径)
pool = photomosaic.make_pool('*.jpg') #图片池,这里用我们刚才爬取的图片
mosaic = photomosaic.basic_mosaic(image, pool, (100, 100)) #最后一个参数是要合成图片的长宽使用的图片数量
photomosaic.imsave(os.getcwd() + '/output/basketball_mosaic.jpg ', mosaic) #我们将合成的图片放到output文件夹里(不会乱)
代码主要学习自崔庆才大佬