标签:python爬虫

python

超级易懂爬虫系列之使用scrapy框架爬取妹纸图

在前面一节中带领大家了解了scrapy框架的基本架构与使用,且与前面我们自己写的简单的架构进行了比较,让大家能够很容易明白这个框架的数据流的流程。然后带领大家爬取了一个页面的妹纸图让大家更容易上手,接下来就带领大家正式使用scrapy框架爬取全部页面的妹纸图,为了心仪的妹纸一定要学会哦,哈哈哈. 在前面一节中我们说过scrapy框架自动帮我们创建的工程包括一下几个板块: spider:这个是需要我们自定义实现的spider组件,主要是重写其parse函数来解析传进来的Response对象 items:用来定义我们需要解析的数据的字段,如为例爬取妹纸图,我们需要知道妹纸图的下载地址,因此可以定义一个img_src字段用来表示妹纸图的下载地址 pipelines:用来处理数据,不需要继承自scrapy框架类,但需要我们在setting.py中进行配置说明,然后重写其def process_item(self, item, spider)函数,在改函数中对传入的item数据对象进行处理 settings 整个工程的配置文件,如果我们需要使用pipelines模块,需要在改文件中打开pipelines配置代码,即去掉框架自动生成的注释 那么当我们要爬取当前页面相关联的全部页面很显然需要修改的是spider组件中的代码,在parse函数回调时我们不仅需要获取妹纸图的下载地址,同样也需要获取相关联的url,在前面也讲过,我们需要使用Request对象来向scrapy引擎传递下一个请求,同时在Request对象中指定回调函数,代码如下: [crayon-5f03a69a66575691792297/] 代码注释很详细,相信大家都看得懂,主要就是在上一节的spider.py模块中添加了爬取全部页面的代码,即在parse函数中返回Request对象,在该对象中指定下一个带爬取的url和回调函数即可。可以看到和上一节代码不同的是我们使用的不是return语句,而是yield,关于该表达式,简单的说一下其作用就是返回一个表达式,但和return不同的是,包含yield的函数已经不在是一个函数,而是一个可迭代的生成器,因此返回后不会结束该代码,而是类似与操作系统中的中断的作用,yield返回之后,程序的代码中变量的值会在此保存下来,待执行下一次迭代(当包含yield表达式时,该函数就是一个可迭代的生成器)时会从该中断语句处开始执行。关于yield的更多细节及请大家自行百度了解。 另一个需要注意的是,我们同样需要进行url去重,即定义一个集合保存需要爬取的url,然后如果新出现的url已经在该crawed_urls集合中,那么就不需要添加进去,如果不在则需要添加进去,然后返回Request对象。具体细节大家可以仔细的看代码,注释很详细。 当然如果某些网址需要使用设置header,cookies才可以访问的话,我们就不能够使用上述的代码了,因为使用start_urls的方式实质上是框架自动帮助我们发送了Request请求,但是该请求不带headers,cookies等参数,因此我们需要自己处理初始的Reques请求,此时我们只需要重写start_requests(self)函数即可,代码如下: [crayon-5f03a69a6657d968322079/] 首先设置cookies和headers,然后重写start_requests(self)函数,在该函数中返回Request对象时指定cookies或者headers参数。完整的spider模块代码如下: [crayon-5f03a69a6657f236437248/] 其余模块的代码不需要改动,然后我们运行程序,可以看到在磁盘的C:\Users\htq\Desktop\girl_目录下已经为我们自动保存好了全部页面的妹纸图哦,如图: 好了,爬取全部页面妹纸图的程序就写好了,细心的小伙伴可以发现下载下来的图片的顺序和我们之前不用框架而是自己写的程序下载下来的顺序不一致,可以明显的感觉到很多页面的图片是交替出现的,这是因为scrapy框架使用了异步多线程的方式,因此图片的下载和爬取不是按照一个页面下载完成再去下载另一个页面的图片,而是爬取页面和图片下载交替进行,因此当前正在下载该页面的第一张妹纸图,下一秒可能就爬取到了另一个url下载该页面的第一张妹纸图,因此可以明显感觉到使用scrapy框架的下载速度要快得多,这也是使用框架的好处之一,可以显著的提高程序运行效率。   更多关于爬虫的干货,请继续关注超级易懂爬虫系列!   注:本文首次发表于huqi.tech,谢绝转载,如需转载,请注明出处:huqi.tech

python

超级易懂爬虫系列之爬虫框架scrapy

在前面的文章中,我带领大家一步一步从学习了爬虫的理论知识,相信大家为了心仪的妹纸都已经学会了,最后也动手写了一个简单的爬虫架构,之所以抽象出一个简单的架构就是为了让大家能够更好的理解爬虫框架,正所谓‘不要重复造轮子’,一个成熟框架是经过很多场景使用的考验的,其稳定性和功能的强大性远比我们自己写一个爬虫程序要好的多,因此本节就带领大家玩一下常见的爬虫框架scrapy。 python常见的爬虫架构一般包括pyspider和scrapy,前者是国人搞的,容易上手,但是在对windows的支持性不是很好,在win下很容易出现一些奇怪的bug,如很容易出现‘python已停止运行’这样的错误,因此本节以scrapy框架为例向大家讲解。 首先需要安装scrapy,因为本人使用的是windows操作系统,因此以windows为例,打开cmd,然后输入如下命令 pip install Scrapy 输入该命令后就可以看到会自动下载scrapy相关组件,如图: 出现如上图所示即表示正在下载相关组件,我们只需要等待即可,当命令行窗口出现Successfully installed字样就表示安装成功,如图 如图即表示安装成功,我们还可以验证下,命令行输入scrapy,出现如下内容就表示确实安装成功。 这是官方文档:https://doc.scrapy.org/en/latest/index.html 既然是学习框架的使用,那么我们首先来看一下官方给出的架构图了解下整个框架的执行流程大概是怎样的。 整个架构最核心的是当中的ENGINE,即执行引擎,主要用来负责控制系统所有组件之间的数据流,这些组件主要包括: scheduler主要用来接收来自引擎的requests请求,然后将其入队,等到需要的时候在将队列中的Requests对象传递给引擎,这就类似于我们自己写的爬虫架构的url管理器的部分角色。只不过我们的那个架构较为简单,只是把url放到集合中,而此处是把Request对象放到队列中 downloader负责抓取网页,然后将抓取到的结果Response对象传递给引擎,然后引擎将其传递给spider处理,这和我们自己写的爬虫架构中的网页下载器功能类似 spider 该组件是用户自定义的类,通常继承于scrapy.Spider。用来解析Response对象,然后从中提取出item(scrapy中的组件,实质上是用来保存数据),这和我们自定义组件中的spider_main功能类似 item pipelines:用来处理spider组件获取的items,如去重,持久化等,主要用来保存数据。这个和我们前面自定义架构中提到的output_data模块类似。 通过对这些组件的介绍,我们可以看到这和我们前面自定义的爬虫架构基本类似,只不过我们那个很简单而已,这也是为何前面要总结一下爬虫架构的原因,因为这样能够帮助我们更容易去理解复杂的框架。 介绍完了该框架的核心组件,接下来看下这些组件之间是如何协同工作的,即数据流是如何传递的。我们仔细看上面的架构图,会发现上面标注着一下数字和箭头,这就是整个框架的数据流的流程图。因此整个框架的工作原理如下: 引擎从spider组件中获取一个初始Request请求 引擎调度Request将其入队到Scheduler组件中,同时获取下一个待爬取的请求 Scheduler组件返回下一个带爬取的Request请求给引擎 引擎将获取到的Request请求传递给downloader组件 downloader组件获取到请求之后会下载该页面,下载完成之后会生成一个Response对象,然后将其返回给引擎 引擎从downloader组件中接收返回的Response对象,然后将其传递给Spider组件处理 Spider组件处理接收到的Response对象,从中解析出item和新的Request请求,然后将其返回给引擎 引擎将Spider组件解析的item传递给item pipelines组件,同时将解析的Request请求传递给Scheduler组件入队,然后从Scheduler组件中获取下一个待爬取的Request请求。 重复上述过程,直至Scheduler组件中无Request请求为止 从这个执行过程可以看到,引擎起到调度作用,整个执行流程和我们自定义爬虫架构的执行流程几乎一模一样,只不过没这个复杂而已。 更多详细内容大家可以去官网看:https://doc.scrapy.org/en/latest/topics/architecture.html scrapy框架介绍的差不多了,接下来看看如何使用,首先打开cmd,切换到我们想创建工程的目录下,执行如下命令: [crayon-5f03a69a6691e006126624/] 该命令会在project_dir目录下自动创建一个名为myproject的scrapy工程,如果不指定project_dir则project_dir会和myproject一样,通常我们不需要指定该参数。如图 然后我们在对应的工程下会看到scrapy为我们自动创建了如下文件: 这些文件和我们前面提到的scrapy组件基本一一对应。我们只需要在spiders中自定义spider组件重写scrapy为我们自动生成的parse函数的逻辑即可,注意settings.py是整个scrapy为我们的工程生成的配置文件,如果是自动生成的,里头很多配置属性都注释起来了,其中的ITEM_PIPELINES如果我们要在pipelines.py中处理我们的item的话需要我们将注释去掉,不然框架是不会执行我们在pipelines.py中写的代码的。这一点需要注意。 好了现在我们就开始用scrapy框架来改写前面我们写的爬取妹纸图的程序,为了让大家超级易懂,还是先易后难,一步一步扩充其功能。   好了整个工程就用scrapy框架改写好了,是不是so easy,因为很多事情框架都为我们做好了,接下来运行下程序,可以看到在磁盘的C:\Users\htq\Desktop\girl_目录下已经自动为我们下载好了妹纸图,和之前不使用框架的效果一样。如图: 是不是很简单,而且可以明显的感觉到使用框架速度比之前我们自己写的爬取妹纸图的程序速度更快。基本上几秒搞定。 这样我们就基本学会了scrapy框架如何使用,其它更多复杂功能将会以超级易懂爬虫系列的形式讲解,更多关于爬虫的干货,请继续关注超级易懂爬虫系列!   注:本文首次发表于huqi.tech,谢绝转载,如需转载,请注明出处:huqi.tech

python

超级易懂爬虫系列之使用多线程爬取妹纸图

在前面的超级易懂爬虫系列中我们将爬虫的理论知识与实际操作相结合,相信大家都学会了,还没看过的猛戳以下链接 超级易懂爬虫系列之爬虫入门爬取妹子图 超级易懂爬虫系列之爬取妹子图 超级易懂爬虫系列之爬虫简单的架构 为了让大家能够更加容易明白,这个系列采取了先易后难,逐渐扩充其功能的方式进行讲解,在前面也说到过,在爬取妹纸图的过程中会将妹纸图保存到本地,因为这涉及到I/O操作,相对而言是很费时的一种操作,在前面爬取到某一网页的妹纸图时采取的是一个一个保存的方式,也就是说当爬取到了一个网页的时候需要等到将该网页的所有的妹纸图都保存到本地后才可以爬取下一个网页,而将妹纸图保存到本地相对而言算是耗时操作,因此我们想要是能够在爬取到该网页的妹纸图后能够同时保存n个妹纸图该多好,而不是一个一个的保存,这就是多线程的操作,通过开启多个线程来同时执行n个保存妹纸图的操作,从而提高程序的运行效率。在python中多线程是通过thread/threading模块来完成的,其中threading模块功能比thread模块功能更加高级,使用起来也更容易,因此我们以threading模块为例进行讲解。下面我们先来了解下该模块,然后使用多线程将我们前面的爬取妹纸图的程序进行改写,最后来测试下,采用多线程和不采用多线程程序的执行效率之间的差距。 了解了基本理论之后下面我们就来将之前的程序改写为使用线程的方式 [crayon-5f03a69a66d34726015921/] 程序代码注释很详细,相信大家都看得懂,主要就是把原来的保存妹纸图的I/O操作放到一个单独的函数中,然后将其传给Thread类作为参数,这样每一个保存妹纸图的操作就是一个单独的线程操作。 然后测试一下使用多线程和不使用多线程的运行效率各是多少。首先运行我们在超级易懂爬虫系列之爬取全部妹子图中讲解的程序,这个是没使用多线程的,测试结果如下: 然后运行上面的使用多线程的程序,测试结果如下: 可以看到使用多线程明显效率提高了不少,如果I/O操作越密集,这种优势会越明显。   注:本文首次发表于huqi.tech,谢绝转载,如需转载,请注明出处:huqi.tech  

python

超级易懂爬虫系列之爬虫简单的架构

在前面的几篇文章中,我带领大家学习了爬虫的基本理论知识,同时带领大家学会了如何爬取自己心仪的妹纸图,现在对前面的内容做个总结,把爬虫的一些知识点抽取出来做一个简单的爬虫架构的分析。之所以这么做是为了后面带领大家使用分析爬虫框架时更容易明白,在后面讲解scrapy爬虫框架时大家会发现scrapy的基本组件与原理与这个几乎一模一样,只不过我们这个很简单而已。 在超级易懂爬虫系列之爬虫入门爬取妹子图 中(如果你还没看的话建议先去看一下)我们谈到爬虫是从一个网页开始不断爬取与之关联的url,然后抓取我们感兴趣的数据,那么首先就需要抓取网页,然后解析网页的内容,这样才能找出我们感兴趣的内容,同时还需要知道哪些网页已经爬取过了,哪些网页未爬取,因为网页之间的url可能会互相指向,因此要保存那些已经爬取了的url,爬取过的就不在爬取,同时新爬取的网页上可能存在指向新的网页的url,因此需要把新的url保存起来用来下一轮进行爬取。因此我们可以总结出爬虫至少需要以下三个模块。 网页下载器:用来将互联网上的网页以html的形式抓取下来 网页解析器:从抓取到的html文件中解析出我们感兴趣的数据 url管理器:用来管理哪些url是已经爬取过的,哪些是新增加的未爬取的url 用图示表示如下: 从这个图中,我们可以看到网页下载器,网页解析器,Url管理器组成了一个闭环,即程序中肯定存在一个while循环,在这个循环中,网页下载器不断的从Url管理器中取出一个待爬取的url,然后将该url的内容抓取下来,供网页解析器解析,网页解析器一方面会解析出我们感兴趣的数据,如妹纸图的下载地址,然后我们可以将其处理输出,产生价值数据,如将妹纸图下载下来保存至本地欣赏,另一方面网页解析器也会从当前url对应的html文件中解析出新的符合我们规则的新的url,如该妹纸图页面还存在指向其它页面的链接,如上一页,下一页可以浏览其它妹纸图,我们需要将新产生的url添加到url管理器中,在这个添加的过程中,需要判断该新产生的url是否是已爬取的(说明该url已经被抓取过)或者是否已经在Url管理器中(说明之前的某个页面存在指向该页面的url,导致该url已将添加到了url管理器中,不过还未爬取而已),如果该url未爬取同时也不在url管理器集合中,那么说明该url是一个合格的新的url,需要将其添加到url管理器中,重复上述过程(即while循环)直至url管理器中的url全部被取出为止,说明相关联的网页已经全部爬取完成。 这就是爬虫一个简单的架构,那么我们就按照上述架构来改写我们在超级易懂爬虫系列之爬取全部页面的妹子图中写的代码。 首先我们创建一个spider_girl的python工程,然后依此创建html_downloader.py,html_parser.py,url_manager,spider_main分别代表上面说到的网页下载器,网页解析器和url管理器以及爬虫主程序。如图: 其中spider_main是整个爬虫的调度模块,主要负责构建上面三个模块的实例以及网页爬取循环的控制,代码如下: 然后运行spider_main模块,可以看到和之前的效果是一样的,在程序控制台输出了所有的相关的妹纸图的url,在磁盘的C:\Users\htq\Desktop\girl目录下自动保存了心仪的妹纸图。 可以看到核心代码和我们在超级易懂爬虫系列之爬取全部页面的妹子图中讲解的是一样的,只不过此处根据各个模块的功能将其单独抽象为了一个类,然后提供了相应的功能函数,但是核心思路还是我们在前面讲到的架构图,此处将其抽象出来主要是为了后续更容易扩展其功能,如我们还可以将spider_main模块中的数据处理的那块再抽象出来搞一个数据输出模块output_data.py,这样如果后续需要将文件读写放到线程中时很容易直接改写output_data.py的代码,而不需要过多的改写spider_main中的代码。另一方面是为后面带领大家玩scrapy框架时大家能够更容易明白,在后面讲解scrapy爬虫框架时大家会发现scrapy的基本组件与原理与这个几乎一模一样,只不过我们这个很简单而已。   更多关于爬虫的干货,请继续关注超级易懂爬虫系列!   注:本文首次发表于huqi.tech,请勿转载,如需转载,请注明出处:huqi.tech

python

超级易懂爬虫系列之爬取妹子图

在前面一节中,我们首先讲解了关于爬虫的基本理论知识,然后带领大家动手写了一个入门级的爬虫程序–爬取心仪的妹子图,什么?你还不知道?赶快去看:写给小白看的爬虫系列之爬虫入门爬取妹子图 不知道大家消化的怎么样了,哈哈大家看到了自己心仪的妹纸吗?不过在前面一节中为了让大家更好的理解爬虫,采取了先易后难的策略,只爬取了一个网页的妹纸图,然后有的小伙伴觉得这不足以体现出对自己女神的热爱啊,要把我家女神全部的美图都抓取下来欣赏,好吧,现在就满足你对女神的全部幻想,本节带领大家在原来基础上爬取所有的相关网页的美图,让你一次看个够!想想还有点小激动呢? 在前面一节中我们讲过互联网上的网页存在很多的url链接,这些url可能相互指向,因此如果要爬取全部的url,我们需要知道哪些url已经被爬取过,哪些是新增加的url,在新增加的url所在的html中也可能存在新的指向其它网页的url,因此首先我们需要知道这些url的共同特点,即这些url的格式是怎样的,然后通过一个正则表达式来匹配这些url的格式,从而在html中搜索出相关的url。如图,我们打开http://iyangzi.com/?p=21,然后会看到当我们浏览完了该页面的全部美图之后,在页面的底部会存在2个指向其它页面的链接用来浏览上一页和下一页,类似于博客文章底部会搞一个上一篇,下一篇这样的跳转链接按钮一样,同样的,我们按F12,点击带箭头的光标,然后让右侧的源码区域自动定位到相应位置,我们可以看到该跳转链接为http://iyangzi.com/?p=10 ,如图 同样的我们可以多试几个页面,当然也可以直接点击这些链接,然后在浏览器的地址栏可以看到这些链接,最终可以发现跳转url的格式都是类似于http://iyangzi.com/?p=数字的形式,而且数字后面无其它内容,即是以数字结尾的,因此我们可以使用正则表达式来匹配这些具备类似格式的url,即 [crayon-5f03a69a671f8575489351/] 这样我们就可以从html中过滤掉不相关的网页的url,找出我们需要的url,然后将这些url添加到带爬取的集合中,余下的内容就和爬取一个网页是相同的啦。不过这里需要注意的是,我们还需要一个记录已经爬取了的url的集合,这样当我们爬取一个网页的时候就从保存新增加的url的集合中取出该url,然后将其添加到已经爬取的url的集合,当我们在一个页面中发现新增加的url时就要考虑该url是否已将在待爬取的url集合中(表示该url和之前的某个url存在相互链接,导致该url已经添加到待爬取url集合中,因此不需要重复添加)或者在已经爬取的url集合中(表示该url已经爬取过)即: [crayon-5f03a69a671fd908675915/] 其中的new_urls是新增加的待爬取的url集合,crawed_urls是已经爬取的url的集合,如果既不在新增加的url集合中也不在已经爬取的url集合中才说明该url需要爬取。这一块就是爬取全部相关网页的思路,我们先小结下重点: 分析多个url的格式,抽象出这些url的特点,一般会用正则表达式匹配 需要两个集合,一个用来保存每爬取一个页面后新增加的url,一个用来保存已经爬取了的url 新增加的url既不在保存新增加的url集合new_urls中也不在已经爬取了的url集合crawed_urls中才表示该url需要被爬取,因此我们将其添加到保存新增加的url集合new_urls中,供下一轮爬取使用 重复上述过程,直至新增加的url集合new_urls中的url被全部爬取为止,此时意味着全部的相关网页爬取完成。 现在我们来开始爬取和心仪妹子相关的全部网页的美图吧,是不是很激动,哈哈!代码如下: [crayon-5f03a69a671ff994209865/] 程序代码注释很详细,相信大家都看的懂,主要是在上一节内容的基础上添加了爬取全部网页的内容,结合上面的小结和代码估计大家一会就看明白了,然后运行程序,在磁盘的C:\Users\htq\Desktop\girl_目录下就会自动保存心仪的妹纸图哦,如图:   图片太多,只截了一页的图,哈哈,心仪的妹纸已经到碗里了,赶快去看看吧!   这样就完成了爬取全部相关网页的功能啦,在前一节中说过爬虫远不止这么简单,如某些网站会进行反爬虫,因此面对这种情况我们需要应对反爬虫,如使用多线程或者多进程提高效率,如本实例中会通过文件操作的方式将从网页上爬取的妹纸图片保存到本地,这相对而言是很耗时的,因此我们可以放到一个线程中进行处理,再如使用爬虫框架等等,这些内容将会以爬虫系列的形式进行讲解,希望大家后期继续关注,多多支持!   注:本文首次发表于huqi.tech,请勿转载,如需转载,请注明出处:huqi.tech

python

超级易懂爬虫系列之爬虫入门爬取妹子图

首先解释下什么是爬虫以及为何需要爬虫。爬虫定义: 一段自动抓取互联网信息的程序 这里为了让小白能够明白,没引用百度百科的定义。那么为何需要爬虫呢?我们知道互联网是由海量的网页组成,每一个网页都对应着一个url,每一个网页上也可能链接着其它的网页的url,每一个html网页上都展示着一些信息,如文本,图片等,当我们在浏览这些信息时,可能会发现很多我们感兴趣的数据,如心仪的妹子图,觉得这个妹子好漂亮,想把这张图片保存下来,当然如果只是几张妹子图,我们可以使用浏览器图片保存功能保存到磁盘,但是如果是几千张妹子图,我们手动的一个一个保存岂不….,因此我们会想要是能够有一个自动帮我们抓取网页妹子的程序帮我们来完成这个过程,我们只管欣赏妹子多好。对这就是爬虫,爬虫能够从一个页面的url开始,不断的爬取与之相关联的所有的url,且能够抓取我们感兴趣的有价值的数据,如妹子图。当然这只是一个简单的例子而已,事实上爬虫的功能远远不止爬取妹子图这么简单,爬虫在搜索引擎中也能够大显身手,总之爬虫的价值在于让互联网上的数据为我们所用。 好了说明了什么是爬虫以及为何需要爬虫,现在就来实现一个简单的给小白看的入门的爬取妹子图的爬虫程序,那么一个简单的爬虫程序需要哪些部分组成呢?还是按照上面的例子来看,既然爬虫是从一个网页开始不断爬取与之关联的url,然后抓取我们感兴趣的数据,那么首先就需要抓取网页,然后解析网页的内容,这样才能找出我们感兴趣的内容,同时还需要知道哪些网页已经爬取过了,哪些网页未爬取,因为网页之间的url可能会互相指向,因此要保存那些已经爬取了的url,爬取过的就不在爬取,同时新爬取的网页上可能存在指向新的网页的url,因此需要把新的url保存起来用来下一轮进行爬取。因此至少要包括网页下载器,网页解析器和Url管理器,一个用来抓取网页,将互联网上的网页以html的形式抓取下来,一个用来解析网页数据,从抓取到的html文件中寻找我们感兴趣的数据,一个用来管理已爬取的url和新增加的url。既然是写给小白看的,那么初次就不搞那么复杂,我们首先选择一个网页爬取,然后逐渐扩充其功能。这样能够让小白更加容易明白,当你看完了本教程,觉得原来爬虫也没那么难,那就达到我们的目的了。下面就进入正题,开始抓取我们心仪的妹子图之旅吧。 python中抓取网页使用urllib2,该模块是官方内置的,网页的解析使用BeautifulSoup,该模块是一个第三方库,使用时需要先安装该库,我们一个一个来看: urllib2/requests urllib2是python官方的url模块,因为是官方内置的,所以使用时只需要要import urllib2即可 requests是第三方的lib,相对urllib2功能更加强大 因此是给小白看的,所以本文章以urllib2为例进行讲解,首先我们来看一下urllib2中一些重要的函数 BeautifulSoup 是用Python写的一个HTML/XML的解析器,该解析器会将html/xml文件看作一个DOM(Document Object Model)树,每一个html中的节点标签类似一棵树的节点。因此这是一种结构化的解析方式。下面我们来了解下如何使用。 这是文档官方网址:https://www.crummy.com/software/BeautifulSoup/bs4/doc/。 BeautifulSoup的使用一般遵循如下几个步骤 构造一个BeautifulSoup对象 搜索节点,其中搜索节点可以按照节点名称如html中的<a>,<div>标签,节点属性如href或者class属性,节点的内容三个方面来搜索,主要涉及的函数是find和find_all 访问节点的属性,内容,当搜索到了对应的节点之后就可以访问节点的内容。 下面一一介绍: 好了基本原理都讲完了,赶快来抓取我们心仪的妹子哦,只需简单的几个步骤,心仪的妹子图就到碗里来了哦! 首先找一个心仪的妹子,这个就看个人喜好了,看谁是你心中女神了,看谁长的漂亮啦,比如刘诗诗啦,这里少年就以少年心中的女神90后演员杨紫(因为喜欢她在青云志中饰演的陆雪琪,被仙哭,被美哭有木有)为例。首先我们在浏览器中打开心仪妹子图网址http://iyangzi.com/?p=173,然后在心仪的图片上右键选择检查元素,或者直接按F12,就可以看到网页的源代码了,然后点击那个带箭头的选项,如图: 然后你会发现当鼠标在左侧区域移动时右侧的源代码区也会随之移动定位到对应位置,这样我们就可以找出心仪的妹子图片位于那个tag下,如图通过多次移动我们发现妹子图位于<div class=”post-conten”>的<p>tag下,如图: 找到了我们感兴趣的数据之后,我们就可以写一个爬虫程序自动为我们抓取心仪的妹子图哦,然后将抓取的妹子图保存到我们的磁盘上就可以了哦,代码如下: [crayon-5f03a69a6753e679041884/] 代码是不是很简单,基本上就是前面介绍的那些知识点,然后运行程序可以看到,控制台输出了妹子图的网络地址 在磁盘的C:\Users\htq\Desktop\girl目录下已经自动帮我们保存好了心仪的妹子图片哦,还不赶快去欣赏欣赏。 好了,一个简单的入门级的抓取妹子图的爬虫就写好了,嗯,不仅学会了写爬虫,还收获了妹子图,简直不要太激动,小伙伴们赶快去试试抓取自己心仪的女神的图片欣赏吧。 当然这只是简单的讲解了爬虫的原理,爬虫远不止这么简单,如前面说的爬取互联网上海量的url的数据,对已爬取和新增加的url进行管理等,再如某些网站会进行反爬虫,因此面对这种情况我们需要应对反爬虫,再如使用多线程或者多进程提高效率,再如使用爬虫框架等等,这些内容将会以爬虫系列的形式进行讲解,希望大家后期继续关注,多多支持!   注:本文首次发表于huqi.tech,请勿转载,如需转载,请注明出处:huqi.tech   扫描二维码实时接收最新技术干货推送,而且会不定期的发布互联网名企内推机会哦!