爬取网页图片

前言

这几天又看了下python的视频,突然又对python感兴趣起来。以前只是学了下python的基础,感觉和其他语言没什么大的区别,再加上编程游戏的插件pygame一直没装上,遂放弃了。
最近心血来潮突然又想用python来搞游戏开发,就上网搜了教程安装pygame,这一搜便一发不可收拾。得知安装pygame需先安装pip,我就按着教程来,刚开始看的第一个教程是错的,走了很多弯路,后来果断换教程。pip的安装可真不一样用的是cmd命令行来安装,只要切换到相应路径,输入pip install,后面文字就一直滚动,看的贼爽。习惯了windows死板的next,next无脑式,用这个可算真长见识了,也牛逼多了。
行吧,不讲那么多话外题了。要想用python爬取网页内容得先安装python3.7,pip
输入python
在这里插入图片描述
输入pip
在这里插入图片描述
如果你输入的结果反馈和我的都一样就证明你的安装成功了,且环境变量也配置好了。
具体python安装可以在其他博客上看,以后我也打算把所有工具的安装教程都分享下来,给路过的小白看看。
python推荐教程:添加链接描述
小甲鱼的视频诙谐幽默,通俗易懂,极力推荐

首先爬取的是html内容

用python爬取一只猫的图片

import urllib.requestresponse =urllib.request.urlopen('http://placekitten.com/200/300')
cat_img =response.read()with open('cat_200_300.jpg','wb') as f:f.write(cat_img)

在这里插入图片描述
wow当时出了这只猫图片的时候我还是相当兴奋的,原本只有.py一个文件,在Idle上运行过后,蹦出一只猫出来,当时我就知道自己成功爬取了网页内容!!!怎么讲呢这只是一小步吧,主要让我认识到了学习编程给我带来的巨大便利,而这是c语言和java从未给我的感觉。
ps:图片生成的默认途径是.py同级目录

当我爬取一个图片后就想着能不能一次性爬取更多的图片,可以想象,当初创建公众号的时候,为了写点段子,我在百度上搜了好多的图,都是一个一个的点击下载,特别麻烦。现在通过python只需要按一下回车键成百上千的图片就会出现在我的文件夹里,再不需要一个一个去点了。

刚开始我是先看了一遍视频,第二遍看的时候就照着视频敲,代码量少的还行。十二十行的还凑合,一旦代码量达到数百行,bug量就飙升了。所以我推荐那些代码多的就直接去网上找源码了,直接复制粘贴下来,运行,弄出成果来,在回过头来学习分析代码,也不失为一种好的策略。
我起码花了一个小时去敲源码,后面是由于代码多,运行结果和视频不一致,被迫放弃的。但在敲的过程中我确实对代码结构有了更清楚的认识。

通过python爬取网页内容(正文)

以搜狗图片为例
在这里插入图片描述
爬到的图片
在这里插入图片描述

import requests
import json
import urllibdef getSogouImag(category,length,path):n = lengthcate = categoryimgs = requests.get('http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag=%E5%85%A8%E9%83%A8&start=0&len='+str(n))jd = json.loads(imgs.text)jd = jd['all_items']imgs_url = []for j in jd:imgs_url.append(j['bthumbUrl'])m = 0for img_url in imgs_url:print('***** '+str(m)+'.jpg *****'+'   Downloading...')urllib.request.urlretrieve(img_url,path+str(m)+'.jpg')m = m + 1print('Download complete!')getSogouImag('美女',200,'d:/download/风景/')

其中美女是搜索的关键词,而d:/download/风景/是下载后的图片路径

注意:没有安装requests库的同学,百度一下,用pip直接install就行。
刚开始报错不知道怎么回事一看是第一行,语法也没错啊,就知道是导入的库出错了。

我再提供一种更新的更高级你可以自己键入关键词,且分辨率更高的图片,当然啦,这也都是我从网上找的:
在这里插入图片描述
右边的是出现的图形用户交互界面,你可以任意输入关键字来获取你想得到的图片
(左边红字直接忽略掉吧,反正运行成功,且操作正常)

动漫美女文件夹为空
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在依次下载,稍后我们看看文件夹里出现了什么

在这里插入图片描述
wow好多图片啊,而且后面还在一直增加
在这里插入图片描述
到100个的时候停止。这里有重复图片,极有可能是动漫美女类的主题图片不够,只能用重复的来滥竽充数,凑够100个

在这里插入图片描述

下面贴个源码吧,以后好好分析,争取一日,到网上肆虐爬取图片去

#-*- encoding=UTF-8 -*-
import urllib.request,socket,re,sys,os
from urllib.request import urlopen
import time
from tkinter import *
import webbrowser
from bs4 import BeautifulSoup
import requests
import json
import urllib##############################常量区##############################
sougou_url="http://pic.sogou.com/"
###URL
download_pics_path="D:/download/动漫美女/"
download_pics_num=10
download_success = ""
sougou_pics_tag=["pic_url","thumbUrl","bthumbUrl","ori_pic_url"]
sougou_url_pics_start="http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category="
sougou_url_pics_mid="&tag=%E5%85%A8%E9%83%A8&start=0&len="
sougou_url_pics_start_other="http://pic.sogou.com/pics?query="
sougou_url_pics_mid_other="&did=1&mode=1&start=0&len="
sougou_url_pics_stop_other="&reqType=ajax"
###title
title_key_start="a class=\"nav-tab\" href=\"/pics/"
title_key_stop="<"
###tkinter
window_name="搜狗图片下载器"
window_size="500x700"
frm_bg="white"
real_columnspan=4
label_type_str="---------------------------------------------图片类型---------------------------------------------"
##############################常量区##############################real_url_arr = [] ###组成url集合##############################函数区##############################
###获取网页上标题,返回标题数组
def get_title(url):html = urlopen(url)sougou_html = BeautifulSoup(html.read())title_key = []for ihtml in sougou_html:data1 = str(ihtml).split(title_key_start)if len(data1) > 1:for jhtml in data1:data2 = jhtml.split(title_key_stop)[0]data3 = data2.split("\">")if len(data3) == 2:title_key.append(data3[1])return title_key###获取网页图片并下载,返回下载失败个数
def get_pics(url,path):# 检测当前路径的有效性if not os.path.isdir(path):os.mkdir(path)pics_str = requests.get(url)pics_dict = json.loads(pics_str.text)pics_dict_items = pics_dict['all_items']i_item=0fail_count=0for item in pics_dict_items:fail_flag=0for itag in sougou_pics_tag:try:pic_url=item[itag]pic_title=item['title']if pic_title == "":pic_title = str(i_item)i_item = i_item + 1if pic_url != "":urllib.request.urlretrieve(pic_url, path + pic_title + '.jpg')print(pic_title+": download complete!")fail_flag=1breakexcept:print("download fail!")continueif fail_flag != 1:fail_count=fail_count+1return fail_countdef get_pics_other(url,path):pics_str = requests.get(url)pics_dict = json.loads(pics_str.text)pics_dict_items = pics_dict['items']i_item=0fail_count=0for item in pics_dict_items:fail_flag=0for itag in sougou_pics_tag:try:pic_url=item[itag]pic_title=item['title']pic_title=pic_title+str(i_item)i_item = i_item + 1if pic_url != "":urllib.request.urlretrieve(pic_url, path + pic_title + '.jpg')print(pic_title+": download complete!")fail_flag=1breakexcept:print("download fail!")continueif fail_flag != 1:fail_count=fail_count+1return fail_countdef url_get_othertype():global real_url_arrif PhotoType.get() != "":real_url_arr.append(PhotoType.get())real_url_arr = list(set(real_url_arr))def url_get_phototype(all_type):global real_url_arrreal_url_arr=[]url_get_othertype()if "其他" in all_type:all_type.remove("其他")for i in range(len(all_type)):if CheckType[i].get() == 1:real_url_arr.append(typeBtn[all_type[i]]['text'])real_url_arr = list(set(real_url_arr))def other_type():if OtherType.get() == 1 :type["state"] = "normal"else:type["state"] = "disabled"PhotoType.set("")def get_full_url(all_type):global download_pics_numdown_result["text"] = ""url_get_phototype(all_type)if download_num_str.get() != "":download_pics_num = int((download_num_str.get()))sum = len(real_url_arr) * download_pics_numdown_result["text"] = "准备下载: " + str(sum) + "张照片"fail_num = 0for iurl in real_url_arr:if iurl in photo_type:tmp_url=sougou_url_pics_start+iurl+sougou_url_pics_mid+str(download_pics_num)fail_num = fail_num + get_pics(tmp_url, download_pics_path)else:tmp_url=sougou_url_pics_start_other + iurl + sougou_url_pics_mid_other + str(download_pics_num) + sougou_url_pics_stop_othertime.sleep(1)fail_num = fail_num + get_pics_other(tmp_url, download_pics_path)down_result["text"] ="成功下载: " + str(sum-fail_num) + "张照片"###tkinter label占一行
def write_line(row,text="",column=0,columnspan=real_columnspan,bg=frm_bg):label = Label(frm, text=text, bg=bg)label.grid(row=row, column=column,columnspan=columnspan)return label###调用网页
def callback(url=sougou_url):webbrowser.open_new(url)##############################函数区############################################################UI部分##########################################
root =Tk() #给窗体
root.title(window_name) #设置窗体名字
root.geometry(window_size)
root.resizable(width=False, height=False) ###固定窗体大小frm=Frame(root,bg=frm_bg) #新建框架
frm.pack(expand = YES,fill = BOTH) #放置框架###控制行的参数
real_row=0
###空一行
write_line(real_row)
real_row=real_row+1
###进入官网
Button(frm,text="点击进入搜狗图片官网",command=callback).grid(row=real_row,column=0,columnspan=real_columnspan,sticky=N)
real_row=real_row+1
###空一行
write_line(real_row)
real_row=real_row+1
###图片类型
write_line(real_row,label_type_str)
real_row=real_row+1
###空一行
write_line(real_row)
real_row=real_row+1###checkbutton
photo_type=get_title(sougou_url)
photo_type.append("其他")
typeBtn={}
CheckType=[]
real_column=0
for itype in photo_type:if itype == "其他":OtherType = IntVar()PhotoType = StringVar()type = Entry(frm, textvariable=PhotoType, width=9, state='disabled')  # 添加输入框Checkbutton(frm, text="其他", variable=OtherType, onvalue=1, offvalue=2, command=other_type).grid(row=real_row, column=1)type.grid(row=real_row, column=2, columnspan=4, sticky=W, padx=40, ipadx=60)  # 放置输入框位置else:CheckType.append(IntVar())typeBtn[itype]=Checkbutton(frm, text=itype, variable=CheckType[-1], command=lambda: url_get_phototype(photo_type))typeBtn[itype].grid(row=real_row, column=real_column)real_column=real_column+1if real_column == 4:real_column = 0real_row = real_row + 1
real_row=real_row+1###空一行
write_line(real_row)
real_row=real_row+1###下载个数
lab1 = Label(frm,text = "下载个数:")# 添加Label
lab1.grid(row = real_row,column=0)
download_num_str = StringVar()
download_num = Entry(frm,width=10,textvariable=download_num_str)# 添加Entry
download_num.grid(row = real_row,column=1,sticky=W)
real_row=real_row+1###空一行
write_line(real_row)
real_row=real_row+1###get
Button(frm,text="获取照片",command=lambda: get_full_url(photo_type)).grid(row=real_row,column=0,columnspan=4,sticky=N)
real_row=real_row+1###空一行
write_line(real_row)
real_row=real_row+1###结果
down_result=write_line(real_row)
real_row=real_row+1###空一行
write_line(real_row)
real_row=real_row+1Button(frm,text="退出程序",command=root.quit).grid(row=real_row,column=0,columnspan=4,sticky=N)
real_row=real_row+1mainloop()
##############################UI部分##########################################

等我学成之后,似乎就可以批量爬点小黄图回来收藏收藏了(手动滑稽)

这是另一段代码

import requests
import bs4
import base64
import urllib.request
num_photo = 1
def download_photo(url , num ):global num_photoresponse = urllib.request.urlopen(url)cat = response.read()with open( 'E:/编程/python/练习' + num + '.jpg' , 'wb') as f :f.write(cat)a = num_photoprint("当前已下载第%d张" % a)num_photo = num_photo + 1 def get_url(url): # 下载这个网页headers = { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6735.400 QQBrowser/10.2.2614.400" }res = requests.get(url , headers = headers)return res
def get_soup(res):soup = bs4.BeautifulSoup(res.text , "html.parser")return soupdef get_page(num):# url = input("请输入一个url:")url = "http://jandan.net/ooxx/page-" + str(num) + "#comments"large_url = "http://wx2.sinaimg.cn/large/"res = get_url(url)# with open("date.txt","w" , encoding ='utf-8') as file:#         file.write(res.text)# print(res.text)soup = get_soup(res)num = 0 for i in soup.select('.img-hash'):#print(i.text)num = num + 1 link = base64.b64decode(i.text.encode('utf-8'))# print(link)B_link = str(link , 'utf-8').split('/')[-1]#去找到他的哈希码#print(B_link)New_url = large_url + B_link#print(New_url)download_photo(New_url , B_link , )
def main():print("you should input tow number to request download some picture what you like:")num = input("请输入要下载煎蛋网妹子图的页数:(当前输入第一个数字)")num1 = input("请输入要下载煎蛋网妹子图的页数:(当前输入第二个数字)")for each in range(int(num) , int(num1)):get_page(each)print("下载完成!")
if __name__ == "__main__":main()

网上这代码能运行成功但是不知道图片放哪去了,真是奇怪

后续

说说这几天都干了什么吧,礼拜五的时候,五节c语言课基本把我时间耗完了。苦陷于链表不能自拔,虽然学校才教到循环结构,但我想把后面的难点给理解了。毕竟链表是数据结构的基础,也是重点,懂了链表,算是彻底入门c了。
当然咯,也只是把链表的创建和遍历完成了,途中上机课花了半个小时手打链表,结果一直有bug,可能是我不太懂visual c++的报错机制,错误不会具体将光标指定到你那一行,最后没成功就算了,下课直接吃饭去了。。。
周末的时候跟着社团去公园烧烤野炊,后面就都把时间花在python上了。

怎么讲呢,学习都是循序渐进的,我也不急。现在主要是培养自己对编程的热爱,以及养成每天写博客的好习惯。把这些遇到的困难都记录下来吧,以后回来看的时候肯定颇有感慨的。
还有就是我这样独立自学恐怕不会让我坚持太久,我必须去找一些志同道合的小伙伴一起走下去。尽管学校了气氛不是很好,但总还是有人的。
我现在还是最要提升自己的实力,想着以后有更多的交流成本。

这些天我也发现一些学习方法,比如长代码最好别敲,直接上网找源代码,运行成功后逐段分析,分析完后在脱稿自己打打看,错了在返回看,如此反复,最后对概念的理解会更深一点,也更容易产生兴趣,更容易在自己一个人的时候坚持下去吧。
然后对于一件事情,最好遇到挫折不要坚持超过一个小时,如果还是不成功的话会极大的消耗自己的热情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql中索引不会被用到的几种情况

转载自 sql中索引不会被用到的几种情况 1、查询谓词没有使用索引的主要边界,换句话说就是select *&#xff0c;可能会导致不走索引。 比如&#xff0c;你查询的是SELECT * FROM T WHERE YXXX;假如你的T表上有一个包含Y值的组合索引&#xff0c;但是优化器会认为需要一行行的…

asp.net core合并压缩资源文件引发的学习之旅

0. 在asp.net core中使用BuildBundlerMinifier合并压缩资源文件 在asp.net mvc中可以使用Bundle来压缩合并css,js 不知道的见&#xff1a;http://www.cnblogs.com/morang/p/7207176.html 在asp.net core中则可以使用BuildBundlerMinifier来进行css&#xff0c;js的压缩合并 新建…

新服务器中如何安装jdk(一行命令)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天我们看看如何在服务器中安装jdk&#xff0c;这里指的服务器是linux。 服务器版本&#xff1a;centos 7.8 jdk版本&#xff1a;jdk1.8 下面我们来介绍下命令是什么&#xff1a; yum -…

关于腾讯云域名解析

前言 在浏览qq空间的时候看到了腾讯云的广告&#xff0c;只要一块钱即可注册一个.club域名。想起前段时间看的博客&#xff0c;自己早晚要入手网站搭方面的内容&#xff0c;按捺不住心悸&#xff0c;遂买了个域名&#xff0c;起了个叫woyidiankuan的域名&#xff0c;本来想写k…

linux服务器中如何安装mysql数据库(一次性完成,包含远程连接)

大家好。我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天给大家介绍一下&#xff0c;如何在新服务器中安装mysql数据库&#xff0c;总是捣鼓服务器&#xff0c;每次都去网上查&#xff0c;次次都不一样&#xff0c;浪费好多时间&#xff0c;这次自己记录…

Postman高级应用——流程控制、调试、公共函数、外部数据文件

postman客户端下载地址&#xff1a;https://www.getpostman.com/apps 流程控制 流程控制简言之就是设置接口的执行顺序&#xff0c;流程控制只有在collection runner或Newman里才生效 如果需要实现多个接口的一次循环&#xff0c;只需在每个接口的Tests中编写脚本 postman.setN…

ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N O)

今天早上起来原想着学习python的&#xff0c;想看看mysql&#xff0c;于是陷进去了。 明明没碰啊&#xff0c;怎么突然就启动不了了呢 输入mysql net start mysql 一直显示正在启动&#xff0c;最后蹦出个服务无法启动 网上查了下输入 mysqld --initialize 早上的时候输入的…

如何将base64图像数据以图片的形式上传到云存储obs中

大家好&#xff0c;我是雄雄。欢迎关注微信公众号&#xff1a;雄雄的小课堂。 今天分享个方法&#xff0c;如标题所示&#xff1a; 在日常开发中&#xff0c;我们经常会有这样的需求&#xff0c;将前台拿到的base64图像格式的数据&#xff0c;上传到云存储服务器上&#xff0c…

linux上还原自主nuget包需要注意的问题

问题的产生的背景 由于我们使用了jenkins进行部署&#xff08;jenkins~集群分发功能和职责处理&#xff09;&#xff0c;而对于.net core项目来说又是跨平台的&#xff0c;所以对它的项目拉取&#xff0c;包的还原&#xff0c;项目的编译和项目的发布都是在一台linux的jenkins节…

python爬虫进阶(初始)

该内容主要是爬虫爬取图片以及html&#xff0c;属于库的基本内容&#xff0c;以后再在此基础上进阶更智能更全面的python代码 整体框架大致 目标&#xff1a; 下载图片 创建文件夹并在文件夹里加入东西 批量下载图片到文件夹里 筛选数据 批量筛选指定数据到文件夹里 将数据导入…

Net知识图谱

对于Web系统开发来说&#xff0c;Net其实也是有好多知识点需要学的&#xff0c;虽然目前JAVA是主流&#xff0c;就业市场比较大&#xff0c;但Net也在积极的拥抱开源&#xff0c;大Net Core 2 出来了&#xff0c;这无疑给Net开发者带来更大的希望&#xff0c;好了&#xff0c;以…

域名配置https时,请求无响应的解决方法

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 在项目需要上线时&#xff0c;我们经常会遇到这样的需求&#xff0c;将http的域名换成https&#xff0c;或者当我们使用小程序开发时&#xff0c;只支持https的请求方式&#xff0c…

三步搭建网站

这两天无意中想了解更广泛的编程知识&#xff0c;便去看了些php的视频。我想把本机当成服务器来用&#xff0c;因为事先已经注册了域名&#xff0c;但当我又重新登录腾讯云的时候&#xff0c;上面显示我可以免费领取一个15天的服务器&#xff0c;抱着试一试的心态&#xff0c;领…

jenkins~集群分发功能的具体实现

前一讲主要说了jenkins分发的好处《jenkins~集群分发功能和职责处理》&#xff0c;它可以让具体的节点干自己具体的事&#xff0c;比如windows环境下的节点&#xff0c;它只负责编译&#xff0c;发布windows的生态环境的项目&#xff1b;而linux节点主要负责和它相关的项目&…

一个经典面试题:如何保证缓存与数据库的双写一致性?

转载自 一个经典面试题&#xff1a;如何保证缓存与数据库的双写一致性&#xff1f; 只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性问题&#xff1f; 面试题…

2018NOIP普及组初赛解析

前言 今年因为新政策的原因导致我又得回到普及组 我们东莞的成绩也出来了&#xff0c;虽然本来就是稳进&#xff0c;但是还是要认真对待。 然而我这个菜鸡运气好了点86分 正题 这里就不放题目了&#xff0c;观看本博客之前请拿好初赛试卷 选择题 答案:D 解析:扫描仪是输出设备…

.NET十年回顾

一、 引子 从我还是编程菜鸟时起&#xff0c;.NET就从来没让我失望过。总是惊喜不断。 当年我第一个项目是做个进销存。用的Winform。当时我是机电工程师。编程只是业余心血来潮而已。 .NET的低门槛、VS良好的编程体验及MSDN完善的说明让我从此踏上了码农的不归之路。 回首十…

C#生成anb文件

今天我们来看看C#中如何生成anb文件。 这个anb文件本来是要对接别的平台的&#xff0c;人家提供给我们一个协议&#xff0c;然后通过程序来生成&#xff0c;然后对方会根据生成的anb文件进行解析&#xff0c;然后得到心电图啥的。 代码如下&#xff1a; private void create…

开源纯C#工控网关+组态软件

一、 前言 在园子潜水也七八年了。说来惭愧&#xff0c;这么多年虽然一直自称.NET铁杆粉丝&#xff0c;然仅限于回几个不痛不痒的贴&#xff0c;既没有发布过代码&#xff0c;也没有写过文章。 看着.NET和C#在国外风生水起&#xff0c;国内却日趋没落&#xff0c;我也早觉得有…

面试官:给我说一下你理解的分布式架构

转载自 面试官&#xff1a;给我说一下你理解的分布式架构 # 什么是分布式架构 分布式系统&#xff08;distributed system&#xff09; 是建立在网络之上的软件系统。 内聚性&#xff1a;是指每一个数据库分布节点高度自治&#xff0c;有本地的数据库管理系统。 透明性&am…