前言
这几天又看了下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上了。
怎么讲呢,学习都是循序渐进的,我也不急。现在主要是培养自己对编程的热爱,以及养成每天写博客的好习惯。把这些遇到的困难都记录下来吧,以后回来看的时候肯定颇有感慨的。
还有就是我这样独立自学恐怕不会让我坚持太久,我必须去找一些志同道合的小伙伴一起走下去。尽管学校了气氛不是很好,但总还是有人的。
我现在还是最要提升自己的实力,想着以后有更多的交流成本。
这些天我也发现一些学习方法,比如长代码最好别敲,直接上网找源代码,运行成功后逐段分析,分析完后在脱稿自己打打看,错了在返回看,如此反复,最后对概念的理解会更深一点,也更容易产生兴趣,更容易在自己一个人的时候坚持下去吧。
然后对于一件事情,最好遇到挫折不要坚持超过一个小时,如果还是不成功的话会极大的消耗自己的热情。