1、林天宇用Python3学习编写网络爬虫之一林天宇用Python3学习编写网络爬虫(之一:入门实践)作者:*一、写在前面1、本文适应的读者范围会一点点Python的基本语法;已经安装好了Python3和PyCharm;网络爬虫新手2、本文所使用的开发环境Mac pro / iOSPython3PyCharm3、本文不纠结以下内容为什么选择Python3而不是Python2?答:没什么特别原因,个人喜好。如何安装Pyhon3?请查阅其他文档。PyCharm是什么?为什么不用其他工具。一个常用的Python开发工具,个人喜欢,可参阅其他文档。如果你不喜欢,你也可以用其他工具编码和调试。二、快速开始东
2、北人有句话说:能动手,尽量不瞎叨叨。少些废话,快速开干。1、新建项目和文件启动PyCharm,“Create New Project”。因为估计不需要到特别的框架,所以类型就默认地选择了“Pure Python”,名字就起成了“WebSpider”(我瞎命名的,就是觉得Spider比较帅气而已),然后“Create”如下图:新建一个Python文件,命名为Spider001,毕竟也是我的第一只小爬虫嘛。OK,到目前为止,已经新建一个名字叫做Spider001的Python空白文件了。可以在项目等资源管理器中看到WebSpider项目下面,有一个Sider001.py的文件。我们接下来就对这个S
3、ider001.py文件进行编辑和测试。2、第一爬先写代码,感受一下效果,找找成就感,然后再详细分析和思考。代码如下:import urllib.requesturl = data = urllib.request.urlopen(url).read()data = data.decode(UTF-8)print(data)然后,Run,选择Spider001.py,运行结果如下:由上图可以见,运行正常,而且已经将XX的HTML代码获取到了(见运行窗口的第二行HTML代码)。XX心想,我也不知道倒了什么霉,你们爬虫测试的HelloWorld都喜欢拿我测试,无谓增加我压力。那我们再回头来详细看看
4、刚才的代码:#首先引入urllib库的request子库import urllib.request#接着定义一个我们要爬取的变量叫url# 然后将我们要爬去的网址字符串值赋给url# 可怜的XX。url = # 定义一个data变量,用来获取爬过来的字符串# 下面是urllib的吧啦吧啦的用法,没什么好解释的。# 它就是这么用的,记住就好了。# 其中url是变量。data = urllib.request.urlopen(url).read()# 编码,改变编码。 decode方法。data = data.decode(UTF-8)# print打印出来结果。print(data)# 程序结束
5、我们可以得出以下几点初学者的心得:用到一个urllib的库。Urllib库及其子库的用法,官方文档如下:https:/docs.python.org/3/library/urllib.html 其获取url其内容的方法为:urllib.request.urlopen(url地址).read()将字符串本身使用decode(编码类型)的方法后,可以重新编码3、美女图片!美女图片!都说美女是推动社会发展的重要因素,对美女的追求,也是推动我们宅男技术水平的重要因素。当年在学校机房里用486电脑DOS环境下,冒着被机房老师抓住的生命危险偷偷看舒淇的图片,确实对我当年的技术水平提升很大。第一爬的过程中,
6、只爬了一串HTML源代码,似乎新鲜劲很快就过去了,真正我们要爬的,是美女图美女图啊!网站美女图片站众多,我本想选择我最喜欢的BeautyLeg作为测试的网站,但是很遗憾,可能这个网站的服务器在其他地区,网络速度很慢,图片质量又高,所以每次运行时间都会比较长,不太适合我们前期作为边调试边学习用。所以暂时放弃,不过,美腿们,不要着急,我调试好后,再来爬去你们。不要着急,等我。在此情况下,我随便XX了一个“美女图库”网站。真是XX的,一点广告费都没给的,美女图库。这个网站也是典型的“三级”结构的网站。所谓“三级”结构(别想歪了),指的是:我们先从最简单的开始,先将目标定在基础,也就是最详细这一级的内
7、容开始爬取。我们先点击网站链接,到达第三级的详细图(文)这一层网页。我们避开了需要登录和收费的会员专区的栏目,选择了“免费下载栏目”进入,具体的网址如下:首页:栏目页:内容页:这个网站的内容页是一个图文格式的网页,这一页有一张美女图片,我们从简单的开始,那我们就先将这一页的这张图片爬下来到本地硬盘吧。我们用鼠标在图片上点右键,获取这张图片的准确名称和地址为:从上述地址分析,貌似这个网站的命名还是比较清晰易懂的,能找到规律。也就是说很可能2016是这个明星这个专辑的编号,然后每张图片从1开始依次编号命名。明星专辑的编号是2016,也很可能明星专辑的编号,也是从1开始依次编号的。(究竟是不是这样,
8、会不会被打脸,后面测试了才知道。)老习惯,先上代码,看效果,找成就感。新建一个新的py文件,命名为GetMM131.pyimport urllib.request#估计后续得重用,所以将其写成一个函数def get_img(url,img_name): print(开始读取图片地址: + url) img_info=urllib.request.urlopen(url).read() # 文件IO操作的办法,语法简单实用,一看就明白,暂时不详细说 with open(img_name,wb) as fp: fp.write(img_info) print(已下载完毕,保存为文件: + img_
9、name) return# 用the_url和the_img_name分别存储这次测试的下载的文件地址以及要保存称为的文件名the_url = the_img_name = 1.jpg# 调用下载图片的函数get_img(the_url,the_img_name)运行效果如下:打开程序文件所在的目录,果真1.jpg美女图已经静静地在文件夹下存在了。4、美女图片0.2版!好的,有点感觉了,但是还是不过瘾,看能否一次性把这个2016编号的美女图片集给全部爬下来。我们点开了下面的分页菜单:一页一页看下去,发现其图片的地址果然为:那这就好办了,有规律,用循环来解决。于是我们调整一下程序代码,get_i
10、mg函数暂时不用变,调整一下调用该函数的方式。于是有了以下的代码:i=1while i=12: #因为i的数据类型是int,不能直接变成字符串,所以采用str函数转换了一下 page_num = str(i) the_url = the_img_name = page_num + .jpg # 调用下载图片的函数 get_img(the_url, the_img_name) i=i+1编写完毕,运行!运行效果如下:貌似一切顺利,怀着激动的心情进入文件夹,果然,12张美女图片都在文件夹里待着了。5、美女图片0.3版似乎总还是感觉缺少点什么,如果我们再把程序做得智能一点点,看是否可以,于是有以下几
11、个想法的改进:输入为一个个人专辑的编号;系统自动读取该编号下图片的总数;系统建立一个为编号等目录,然后把该专辑的图片全部保存到该目录下。于是我们要学习几个技能:1)、正则表达式:目的是要从HTML字符串里,找到“共XX页”字样,读取XX这个信息。2)、文件夹操作:目的是如何建立一个文件夹目录,然后将这个图片好存在这个目录里。于是就有了以下的代码:import urllib.requestimport reimport os# 函数get_img# 功能:获取一个网上的图片,然后保存到本地# 参数:url(图片的网址),img_name(图片的名称)def get_img(url,img_nam
12、e): print(开始读取图片地址: + url) img_info=urllib.request.urlopen(url).read() # 文件IO操作的办法,语法简单实用,一看就明白,暂时不详细说 with open(img_name,wb) as fp: fp.write(img_info) print(已下载完毕,保存为文件: + img_name) return# 需要爬取的专辑的参数编号this_f_num = 305#获取该专辑第一页的页面信息,然后采取正则的方式,获取其中共多少页f_html = urllib.request.urlopen( %this_f_num).re
13、ad().decode(gbk)regex = r共(.*?)页pa = pile(regex)# 由于获取的是一个数组格式,但只有一个数字,于是将其读取出来。iMax = int(re.findall(pa,f_html)0)# 建立一个目录this_f_now = os.getcwd()f_path = this_f_now + / + str(this_f_num) +/if os.path.isdir(f_path)=False: os.mkdir(str(this_f_num)# 进入循环下载i=1while i=iMax: #因为i的数据类型是int,不能直接变成字符串,所以采用s
14、tr函数转换了一下 page_num = str(i) the_url = str(this_f_num) + / +page_num+.jpg the_img_name = f_path + page_num + .jpg # 调用下载图片的函数 get_img(the_url, the_img_name) i=i+1输入对应的专辑的编号,如“1500,1771,1881”等,依次运行,效果如下:貌似不错,然后我们到对应的目录下取看看,美女图已经安安静静地分门别类地存好了。三、草草收尾原来以为写个类似读书笔记或实验报告形式的文档会比较简单,但是没有想到页是比较辛苦的。一边做一边截图,小小的一个功能,居然也写了18页。代码依然还很臃肿,功能也还很一般。还有一些需要注意的,如有些网站必须是浏览器才能访问,否则报错;有的网站还需要登录之后才能查看相关信息,等等。考虑到第一次写东西,也还是以成就感为先吧。所以这次到内容先写到这里,也算是草草收尾。计划在以后,还根据自己的学习情况,写一些“林天宇学习XXXX”之类的题目,大家可以在XX文库里搜索“林天宇”或“易动资讯”,没准就找到我了。本文过程中借鉴了少量网上资料,但全文是自己编写,纯属原创,如对您有所参考,我深感荣幸。请随意使用,我不在乎版权,也不必告知我。呵呵。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1