爬虫入门(一)
来源:互联网 发布:爱易编程工具箱 编辑:程序博客网 时间:2024/06/12 21:42
爬虫入门(一)
说起爬虫呢其实网上非常多教程,非常好玩,还能顺便练习一下python,但是呢要维护好一个高效,稳定的爬虫不是一件容易的事噢,本人也是初学者,写一些自己的学习心得,以防以后老年痴呆= =
环境是ubuntu16.04,python3.6.1
在某乎上看到的一个爬虫教程的帖子推荐了一个福利的网站,那我们也先从这个网站开始吧 http://www.mzitu.com 我就不截图了,友情提醒,自备营养快线
进去这个网站之后别光顾着看妹子图,我们可以先到处点点,比如翻页,会看到网站从mzitu.com 变为 mzitu.com/page/2,点进去的套图翻页也是类似原网站后面加个/数字,先记住这个规律,后面显然有用嘛
我们打开网页的检查元素,比如chrome就是快捷键F12,查看网页的源代码,比如我们想看第一个套图,那么我们鼠标右键这个图片,可以看到呢
请留意我鼠标选中蓝色的这里,标签a的属性href里面的这个网址,我们可以尝试点进去,就会发现呢这其实就是进去套图之后的地址嘛,然后我们继续尝试第二个图片,同样的里面属性的这个网址就是这个套图的入口地址,并且我们可以发现,这个网站很良心,把主页上的所有图片都是在<li>
下有顺序排好的,好了,那么有了这个分析基础,我们就可以先写一段程序来获取主页上所有的入口地址吧
import requestsfrom lxml import htmlimport osimport timeclass mzitu(): base_url = 'http://www.mzitu.com' jpg_download_list = [] ##获取主页下所有套图的入口,默认从第一页开始 def getAllPage_location(self,num=1): print(u'开始获取第%s页套图入口地址'%(str(num))) jpg_location = [] now_url = '{}/page/{}'.format(self.base_url,num) selector = html.fromstring(requests.get(now_url).text) for loc in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'): jpg_location.append(loc) print(u'第%s页套图入口地址获取完成'%(str(num))) return jpg_location
这里呢我用的是requests库和xpath语法来获取,可以自行测试一下看看是否入口地址都爬取成功
打印出来之后自己点击一下发现的确可以了,那么我们第一步就成功了,接下来呢我们就要进入到套图里面,分析里面的图片,同样的我们右键一下图片看看
大致翻一下可以知道,标题和图片下载地址都尽在眼前了,然后我们看看怎么获取这套图的图片数呢,我们可以右键最后一页看看代码,发现其实就是在倒数第二个<a>
下的<span>
中嘛,那么我们就可以通过程序来获取图片的下载地址了
##获取套图下的图片的详细信息,包括标题,图片总数,下载地址def getAllJpg_Info(self,url): print(u'开始获取图片下载地址') del self.jpg_download_list[:] ##图片下载地址 selector = html.fromstring(requests.get(url).text) title = selector.xpath('//div[@class="main"]/div[@class="content"]/h2/text()')[0] total = selector.xpath('//div[@class="pagenavi"]/a[last()-1]/span/text()')[0] for jpgpage in range(1,int(total)+1): now_url = '{}/{}'.format(url,jpgpage) #翻页 selector = html.fromstring(requests.get(now_url).text) print(selector.xpath('//div[@class="main-image"]/p/a/img/@src')[0]) self.jpg_download_list.append(selector.xpath('//div[@class="main-image"]/p/a/img/@src')[0]) return title,total
这段程序呢就把图片的下载地址全部放在jpg_download_list里面了,并且我们返回一个二元组,标题和图片数供以后使用,我们打印看看是不是都在jpg_download_list里面了,嗯可以看到自己身体的营养在流失了
好了图片的地址都有了,那我们下一步当然是download到自己的电脑里慢慢看了是吧,代码比较简单,主要是文件的操作
这里唯一注意的是我们前面使用requests库请求的时候返回我是把它转为.text,这里下载是要用二进制文件形式下载的,所以要返回.content格式才能正确下载
def download(self,title_total): print(u'开始下载') count = 1 Jpg_Num = title_total[1] Jpg_Name = title_total[0] dirName = '[%sP]%s'%(Jpg_Num,Jpg_Name) dirName = '{}/{}'.format(os.path.abspath('.'),dirName) isExists = os.path.isdir(dirName) if isExists == True: return False else: os.mkdir(dirName) for jpg in self.jpg_download_list: file_name = '%s/%s.jpg'%(dirName,str(count)) with open(file_name,"wb") as Jpg: print(u'开始下载 [%s]P %s 第%s张'%(Jpg_Num,Jpg_Name,str(count))) Jpg.write(requests.get(jpg).content) time.sleep(0.5) count+=1
我们运行一下看看效果
这样我们的第一个入门爬虫就解决了~从大体逻辑来说,我们先从主页上获得当前页面下所有套图入口的地址->分别进入每一个套图获取它所有图片所有的详细信息->下载,整个流程是比较容易理解和顺其自然的
完整代码
import requestsfrom lxml import htmlimport osimport timeclass mzitu(): base_url = 'http://www.mzitu.com' jpg_download_list = [] ##获取主页下所有套图的入口 def getAllPage_location(self,num=1): print(u'开始获取第%s页套图入口地址'%(str(num))) jpg_location = [] now_url = '{}/page/{}'.format(self.base_url,num) selector = html.fromstring(requests.get(now_url).text) for loc in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'): jpg_location.append(loc) print(u'第%s页套图入口地址获取完成'%(str(num))) return jpg_location ##获取套图下的图片的详细信息,包括标题,图片总数,下载地址 def getAllJpg_Info(self,url): print(u'开始获取图片下载地址') del self.jpg_download_list[:] ##图片下载地址 selector = html.fromstring(requests.get(url).text) title = selector.xpath('//div[@class="main"]/div[@class="content"]/h2/text()')[0] total = selector.xpath('//div[@class="pagenavi"]/a[last()-1]/span/text()')[0] for jpgpage in range(1,int(total)+1): now_url = '{}/{}'.format(url,jpgpage) selector = html.fromstring(requests.get(now_url).text) print(selector.xpath('//div[@class="main-image"]/p/a/img/@src')[0]) self.jpg_download_list.append(selector.xpath('//div[@class="main-image"]/p/a/img/@src')[0]) return title,total def download(self,title_total): print(u'开始下载') count = 1 Jpg_Num = title_total[1] Jpg_Name = title_total[0] dirName = '[%sP]%s'%(Jpg_Num,Jpg_Name) dirName = '{}/{}'.format(os.path.abspath('.'),dirName) isExists = os.path.isdir(dirName) if isExists == True: return False else: os.mkdir(dirName) for jpg in self.jpg_download_list: file_name = '%s/%s.jpg'%(dirName,str(count)) with open(file_name,"wb") as Jpg: print(u'开始下载 [%s]P %s 第%s张'%(Jpg_Num,Jpg_Name,str(count))) Jpg.write(requests.get(jpg).content) time.sleep(0.5) count+=1 def run(self,num): for i in self.getAllPage_location(num): self.download(self.getAllJpg_Info(i))if __name__ == '__main__': mz = mzitu() mz.run(1)
当然呢你能写出这样的代码并不意味着就入门了,因为还有很多问题需要解决和探索的,接下来我会慢慢学习更新,希望有兴趣的伙伴能和我这个zz交流讨论~
0 0
- 爬虫入门(一)
- (一)爬虫入门
- 爬虫技术入门(一)
- python爬虫入门(一)
- 爬虫基础入门(一)
- python 入门爬虫(一)
- Python 爬虫入门(一)
- CSDN爬虫(一)——爬虫入门+数据总览
- Python爬虫总结(一)入门
- scrapy 爬虫 环境搭建入门(一)
- 网络爬虫之Beautifulsoup入门(一)
- Python爬虫入门(一)写在前面
- Python爬虫一(入门综述、基础)
- 一、python爬虫程序入门(图片下载)
- Python爬虫入门一
- Python爬虫入门一
- Python爬虫入门 (一)
- 爬虫爬虫爬虫(一)
- 解决Tomcat: Can't load IA 32-bit .dll on a AMD 64-bit platform问题
- Hbase集群部署计划---安装系列四
- 803D
- 多线程同步问题-练习题2-笔记整理
- 修改文件的权限
- 爬虫入门(一)
- i++底层问题
- linux mysql导入数据库
- 单例设计模式
- 函数、数组和指针的形参
- 有关深度学习领域的几点想法
- Mybatis实现数据的增删改查(CRUD)
- 多线程同步问题-练习题3-笔记整理
- SpringBoot非官方教程 | 第十五篇:Springboot整合RabbitMQ