发出前两篇Python实战的文章以后,有同窗和我反映:你的想法很牛逼,但是我就是看不懂你写的是什么,我Python不熟悉,看起来有点吃力。我细细一琢磨,这点是个问题。对于熟悉Python的同窗,可以看懂我思路,可是对于那些没有Python基础,或者对Python不熟悉的同窗,这样直接扔过来,可能会让他们失望而归。因此,这回我弄了一期手把手的实战教程,同时,在文章中遇到的知识点,还会有提供连接。彻底对新手有好。css
在前两篇Python实战「用代码来访问1024网站」和「用Scrapy编写“1024网站种子吞噬爬虫”」收到了你们的一致好评,可能文章写得比较匆忙,有些术语可能对于Python的初级玩家不是很好理解。因此,我特别准备了一下,用超级详细的解说,细化到每一步,提供查询连接等方法,为Python初级玩家,Python小白和对Scrapy框架不熟悉的同窗,的制做了这篇手把手Python实战教程:用Scrapy爬取下载达盖尔社区的资源。html
好了,废话很少说,学习代码就是要学以至用的。不能写了一遍代码就让代码吃灰。下面就跟我一块儿来搞吧。数据库
小草网站是个好网站,咱们此次实战的结果,是要把“达盖尔旗帜”里面的帖子爬取下来,将帖子的图片保存到本地,同时将帖子的一些相关信息,写入到本地的MongoDB中。这么乍一听,感受咱们作的事情好像挺多的,别慌,我带你慢慢的一步一步来搞起,问题不是很大。编程
Scrapy能够经过pip来安装:bash
$ pip install scrapy
复制代码
接下来,咱们去事先建好的工程目录里面,建立Scrapy的项目。这里,咱们先看一下Scrapy的命令行怎么用,输入$ scray -help
出来框架
看到,建立scrapy的工程的命令是$ scrapy startproject <name>
建立完的结果以下:dom
OK,这个时候,咱们的目录内容变成了以下结构:scrapy
下一步就是建立咱们的爬虫,仍是依靠Scrapy自己自带的命令来建立。输入Scrapy自带四种爬虫模板:basic,crawl,csvfeed和xmlfeed四种。咱们这里选择basic。ide
$ scrapy genspider --template=basic superspider bc.ghuws.men
复制代码
建立成功,会出现如下提示:函数
这时候咱们的工程目录就变成了这个样子:
看到咱们的工程里面多了一个spiders文件夹,里面有一个superspider.py
文件,这个就是咱们此次程序的主角。咱们来看,这个可爱的小虫子刚生下来是长这个样子的:
这里呢,就简单说一下:
好了,废话很少说,既然start_urls是用来作爬虫开始爬取的第一个url,那么咱们就应该把这里面的数值换成达盖尔社区的地址,而后咱们看一下在parse()
里面返回的值是什么。运行方法,就是输入$ scrapy crawl superspider
指令便可:
咱们看到,这个response是一个HtmlResponse类,它里面的text属性,里面的字符串就是网页的html文件。OK,这一步结束以后,咱们下一步就想办法怎样可以解析html网页了。Scrapy是提供了html对象的解析的,它有一个selector类,能够解析html,同时,里面还支持xpath语法的查找和css的查找。可是这个我的感受不是很好用,我推荐用BeautifulSoup4库。安装方法只须要$ pip install beautifulsoup4
。咱们这里须要用这个来解析html,因此讲BeautifulSoup4导进来,在解析,而后咱们就会获得一个beasutifulsoup对象。以后,咱们就要在这个对象里面寻找咱们须要解析的对象。
目前网页已经解析好了,下一步就是要在html文件中,找到每个帖子的信息。咱们回头来看html文件的源码,能够看到,每个帖子其实都是在一个<tr>
tag里面,其实咱们须要的东西,就是下图红色框框里面圈的<a>
tag。
这里,咱们发现,每个帖子的连接入口,也就是<a>
tag是有两个特性,一个是有id值,另外一个是有href
值。因此,咱们要针对soup对象,调用find_all()
方法来寻找有特定内容的全部标签。
咱们获得了一个 a_list
结果,这是一个list对象,长度102。在这些数据中,有些结果是咱们不要的,好比000到007位置的这几个数据,他们在网页中对应的是版规之类的帖子信息,和咱们想要的东西不同,因此,在拿到这个a_list
数据,咱们须要进行一下筛选。
筛选的过程必不可少,筛选的方法有不少种,咱们这里就作的简单一点,只选取18年的帖子。为何会是18年的帖子啊?少年你看,这一列href的值:
第二个数字“1805”,应该就是“年份+月份”。若是不信,则能够跳到好比论坛100页,看到的是16年3月份的帖子,这里面随便检查一个链接的href值,是“1603”。这就印证了咱们的想法是正确的。好,按照这个筛选18年的帖子的思路,咱们来筛选一下a_list
。
看到打印的结果倒是是18年的帖子。可是目前的href并非帖子真正的url。真正的url应该长这个样子:
http://bc.ghuws.men/htm_data/16/1805/3126577.html
复制代码
因此,咱们这里得进行拼接。对比上面的url,咱们目前只有后半部分,前半部分实际上是社区网站的root url。那么咱们在settings.py文件里面添加一个ROOT_URL
变量,并将这个变量导入到咱们的spider中便可。代码就变成了这样。为了方便,我们还能够把帖子的id,也就是.html
前面的那个数字也摘出来,方便往后使用。
目前为止,咱们拿到了帖子的id和帖子的url。咱们的最终目的是要下载图片,因此,咱们得让爬虫去按照帖子的url去爬取他们。爬虫须要进入第二层。这里,咱们须要使用yield
函数,调用scrapy.Request
方法,传入一个callback,在callback中作解析。
如今咱们已经进入了每个帖子的内部,咱们如今尚未拿到的信息有帖子的标题和帖子的图片。仍是和parse()的步骤同样,这个时候,咱们就该分析帖子的html文件了。
咱们先找标题。看到html文件中,标题对应的是一个<h4>
标签。
那这就简单了,咱们只须要找到全部的<h4>
标签,而后看标题是第几个就好。接下来是图片了。每一个帖子用的图床都不同,因此图片部分,咱们先来看一下结构:
大概就是这两种,咱们看到,图片的标签是<input>
,关键点就在type=image
上面,因此咱们尝试着看看能不能根据这个来找到图片的地址。
咱们简单测试一下,看看运行效果:
彻底没有问题,看着好爽。这时候,咱们看结果,会发现,咱们抓取到的image,会有一两个的图床是不同的。
打开也会看到这个图片,里面的内容也和其余的图片不同,而且这个图片不是咱们想要的。因此,这里咱们得作一下过滤。我这里的方法就是要从找到的image_list
里面,把少数图床不同的图片url给过滤掉。通常看来,都是找到的第一个图片不是咱们想要的,因此咱们这里只是判断一下第一个和第二个是否同样就能够。
这样打印出来的结果就没有问题喽。
哈哈,如今咱们已经拿到了帖子的id,标题,帖子的url地址,还有帖子里面图片的url地址。离咱们的目标又近了一步。我以前说过,咱们的目标是要把每张图片都保存在本地,目前咱们只是拿到了每张图片的url。因此,咱们须要把图片都下载下载下来。
其实,当拿到图片的URL进行访问的时候,经过http返回的数据,虽然是字符串的格式,可是只要将这些字符串保存成指定的图片格式,咱们在本地就能够按照图片的解析来打开。这里,咱们拿到帖子的image_list
,就能够在yield出一层请求,这就是爬虫的第三层爬取了。
同时,在第三层爬虫里面,咱们还须要将访问回来的图片保存到本地目录。那么代码就长这个样子:
在上面第二次爬取函数的最后,有个地方须要注意一下,就是上图中红色框框圈出来的地方。这里须要加上dont_filter=True
。不然就会被Scrapy给过滤掉。由于图床的地址,并未在咱们刚开始的allow_domain
里面。加上这个就能够正常访问了。
这样运行一遍,咱们的本地目录里面就会有保存好的下载照片了。
咱们还有个问题,就是咱们须要将每一个帖子的信息(id,title,url,和image)都保存到本地的数据库中。这个该怎么作?
别慌,这个其实很简单。
首先,咱们得针对每一个帖子,创建一个Scrapy的item。须要在items.py里面编写代码:
写好以后,咱们须要在爬虫里面引入这个类,在第二层解析函数中,构建好item,最后yield出来。这里,yield出来,会交给Scrapy的pipeline
来处理。
yield出来的item会进入到pipeline中。可是这里有个前提,就是须要将pipeline在settings.py中设置。
pipeline中咱们先打印帖子的id,看看数据能不可以传入到这里
运行:
看到数据是彻底能够过来的,并且在Scrapy的log中,会打印出来每个item里面的信息。
咱们若是想把数据保存到MongoDB中,这个操做就应该是在pipeline中完成的。Scrapy之因此简历pipeline就是为了针对每一个item,若是有特殊的处理,就应该在这里完成。那么,咱们应该首先导入pymongo
库。而后,咱们须要在pipeline的__init__()
初始化进行链接数据库的操做。总体完成以后,pipeline应该长这个样子:
那么咱们来测试一下数据是否可以存入到MongoDB中。首先,在terminal中,经过命令$ sudo mongod
来启动MongoDB。
那么运行一下,看一下效果:
能够看到,左侧,有名为Daguerre
的数据库,里面有名为postTable
的表,并且咱们的数据成功的写入了数据库中。数据的格式如图所展现,和咱们预期的结果是同样的。
目前为止,咱们完成了:从一页page中,得到全部帖子的url,而后进入每一个帖子,再在帖子中,爬取每一个帖子的图片,下载保存到本地,同时把帖子的信息存储到数据库中。
可是,这里你有没有发现一个问题啊?咱们只爬取了第一页的数据,那如何才能爬取第二页,第三页,第N页的数据呢?
别慌,只须要简单的加几行代码便可。在咱们的spider文件中的parse()
方法地下,加一个调用本身的方法便可,只不过,传入的url得是下一页的url,因此,咱们这里得拼凑出下一页的url,而后再次调用parse()
方法便可。这里为了不无限循环,咱们设定一个最大页数MAX_PAGES
为3,即爬取前三页的数据。
OK,这样就完事儿了,这个达盖尔旗帜的爬虫就写好了。咱们运行一下瞅瞅效果:
是否是很是的酷炫?再来看看咱们的运行结果:
只能说,战果累累,有图有真相。
其实,这个程序,能够加入middleware,为http请求提供一些Cookie和User-Agents来防止被网站封。同时,在settings.py文件中,咱们也能够设置一下DOWNLOAD_DELAY
来下降一下单个的访问速度,和CONCURRENT_REQUESTS
来提高一下访问速度。
就像以前EpicScrapy1024项目里面同样。喜欢的同窗,能够去借鉴那个项目代码,而后融会贯通,自成一派,爬遍天下网站,无敌是多么的寂8 寞~~~~
好啦,能看到这里说明少年你很用心,很辛苦,是一个可塑之才。
废话不说,看到这里是有奖励的。关注“皮克啪的铲屎官”,回复“达盖尔”,便可得到项目源码和说明文档。同时,能够在下面的菜单中,找到“Python实战”按钮,可以查看以往文章,篇篇都很是精彩的哦~
扯扯皮,我以为学习编程最大的动力就是爱好,其实干什么事情都是。爱好可以提供无线的动力,让人元气满满的往前冲刺。代码就是要方便做者,方便你们。写出来的代码要有用处,并且不要吃灰。这样的代码才是好代码。欢迎你们关注个人公众号,“皮克啪的铲屎官”,以后我会退出Python数据分析的内容,可能会结合量化交易之类的东西。
最后,来贴一张达盖尔的图片,记念一下这位为人类作出杰出贡献的人。
【Python实战】用Scrapy编写“1024网站种子吞噬爬虫”,送福利
【Python实战】用代码来访问1024网站,送福利
![关注公众号“皮克啪的铲屎官”,回复“达盖尔”就能够得到惊喜](底部二维码.png