最近两周,都在暑假集训实验室(acm)别人都是学习算法参加比赛,指导老师为我们小部分人开的项目组学习,因为我发现了,算法太灵活,脑袋确实不够用,参加程序设计也没取得好的成绩,所以这学期中后部分就想学习项目。感谢指导老师我们考虑,同时还在督促我们机器学习,瞄准实习岗位的针对性学习....
图片爬虫需要环境:
python 3.6 (官网下载 3.6 https://www.python.org/downloads/)当然最新版是3.7不过由于新版一些第三方库还不完善,或者没适配好,我的同学就是下了3.7结果出了问题,就回到3.6了,还问我重新要安装包。因为现在一些包不能直接pip install 安装。
需要的第三方库: requests(网页请求用的库),re(提取网页信息的正则表达式库),os(系统保存文件路径库)
爬取实例网址:http://pic.sogou.com/
按F12或者鼠标右键进入选择进入网页源代码:当输入动漫时地址变成了http://pic.sogou.com/pics?query=%B6%AF%C2%FE&w=05009900&p=&_asf=pic.sogou.com&_ast=1531399106&sc=index&sut=2506&sst0=1531399105958,由此我们可以知道,爬取自己想要的图片类型是http://pic.sogou.com/pics?query=+输入的关键字,所以带时候,我们只需要把关键字前面的网页地址固定,爬取的类型由运行时程序从键盘输入。
首先定义三个函数,主函数,获取图片的地址的函数,下载图片的函数:
获取图片地址函数:参数是传进来的原始网页地址,img_url保存地址的列表,需要爬取的图片数,num
def getPictureAddress(url,img_url,num):
下载图片函数:img_url保存地址的列表,保存的路径,爬取类型动漫的名字
def getPicture(img_url,path,name):
主函数,像c语言那样,有良好的代码风格
def main():
要说下提取网页图片地址,因为存入的是text文档,不是正常的网页标签树,不能直接用BeautifulSoup解析网页提取。用正则表达式提取,查看网页源代码可以发现:图片地址是thunbul键值对,对应的值,就是图片地址,因为点进去就下载图片,要修改一下后缀,增加后缀.jpg或者.png都是我们要找的图片。所以可以确定是图片地址。
难点:怎么把地址完整有效的提取,这里处理有点麻烦,弄了好几,首先得熟悉正则表达式,然后运用,在处理提取出来的东西,因为会有""这种符号,还得去掉。
由于时间,来不及详细叙述了,因为马上9点实验室下课了,哈哈
就直接放成果和源代码
全部源代码:
import requests,os,re
def getPictureAddress(url,img_url,num):
try:
r=requests.get(url,img_url)
r.raise_for_status()
r.encoding=r.apparent_encoding
print("网页请求成功!")
#正则表达式提取图片地址信息
pattern = re.compile('(?=thumbUrl)\S{1,100}(?=,)')
ls=re.findall(pattern,r.text)
for i in range(num):
url='"'+"http:"+ls[i].split(':')[-1]
#去除首位""字符
img_url.append(url.strip('"'))
except:
print("网页请求失败")
def getPicture(img_url,path,name):
n=0
for url in img_url:
n+=1
r=requests.get(url)
with open(path+name+str(n)+".jpg","wb") as file:
file.write(r.content)
print("*****第%d张图片下载成功!******"%n)
file.close()
print("所有图片下载成功!")
def main():
path="D:\QQPCMgr(1)\Desktop\爬取的资料\图片/"
start_url="http://pic.sogou.com/pics?query="
category=input("请输入需要爬取图片的类型(动物,明星,影视,汽车,动漫,摄影,清新,手绘....)\n")
num=int(input("请输入爬取的张数:"))
img_url=[]
url=start_url+category
getPictureAddress(url,img_url,num)
getPicture(img_url,path,category)
main()
如果有问题,欢迎留言~