查看原文
其他

Scrapy—轻量级爬虫框架(一)

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:徐露露

文字编辑:赵宇亮

技术总编:刘洪儒

有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

好消息:爬虫俱乐部隆重推出数据定制及处理业务啦,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部资深高级会员为您排忧解难!



在前面的推文中我们已经学会了如何写出自己的爬虫,但是如果你想更高效地爬取网页,并记录到数据库,Scrapy还是很值得一推的。它虽是个爬虫的框架,却不是一个简单的爬虫,它整合了爬取,处理数据,存储数据的一条龙服务,听着是不是很心动呢?

虽然Scrapy框架集成了爬虫的一切,但是对于初识它的童鞋来说可能用的有点不习惯,看教程还会各种踩坑。但是不要气馁,小编我也是踩过了好多好多的坑,才学会了它。接下来就一起来学习吧。

1.scrapy爬取原理


Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下:

Scrapy运行流程大概如下:

引擎ScrapyEgine)从调度器Scheduler)中取出一个链接并以Request调度传给下载器Downloader),下载器把信息下载下来,封装成应答包Response),爬虫Spiders)解析应答包,从中解析出来的如果是我们需要爬取的信息Item),则传给项目管道ItemPipeline)进行保存,如果解析出来的下一层链接,那么就继续传送给调度器等待抓取。

2. 建立Scrapy爬虫项目流程


2.1安装scrapy

由于小编使用的pycharm编辑器,所以在默认设置内可以直接下载。如何查看是否成功安装了呢?我们可以打开cmd,输入scrapy version查看一下版本,如果能成功运行得到:

这就说明我们成功安装了scrapy

(安装官方教程:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html


2.2创建项目

首先将路径修改成自己习惯的路径,假设我们将其放在E盘目录下,其次创建一个叫Demo的项目,最后再根据提示进一步指定路径。具体操作如下:

我们可以在E盘下找到被创建的Demo文件。接着用pycharm打开可以发现上述命令会创建包含下列内容的Demo目录:

突然生成了这么多文件,我第一次看到的时候也是一脸茫然,在这简单介绍一下,我们主要关注的文件是:items.py,pipelines.py,settings.py。第一个主要存放我们需要保存的数据名称,第二个文件主要用来执行保存数据的操作,第三个文件中提供了很多定制scrapy组件的方法,我们只需要激活即可。

咦,奇怪了,那我们爬虫的主体在哪里?它需要我们自己创建,我们继续在前面的基础上创建demo.py文件,在cmd中输入scrapy genspider demo www.cgw.gr/news.htm

demo后的是你想要爬取的网址。

值得注意的demo文件必须放在spiders文件夹下。我们打开demo可以看到如下它已经设好的基础模板:

其中start_urls里是我们给定初始爬取的网页,有时链接内容有可能会有些问题,可以手动修改。当然你也可以在里面添加多个网页链接。这样我们就可以在里面编写爬虫的代码了。

首先,我们先确定需要爬取的信息有哪些,Item是保存爬取到的数据的容器,其使用方法和字典类似,并将每个变量的数据类型都定义为scrapy.Field()。 随后的demo.py我们将引用这个DemoItem

然后转回demo.py编写爬虫主体程序:

from Demo.items importDemoItem#将Demo文件下的items文件内的DemoItem函数调用出来
import re  
def parse(self,response):
   html = response.text#获取网页源代码
   reg='<li><span>(.*?)</span><ahref="(.*?)">(.*?)</a></li>'
   infos =re.findall(reg,html)
   items = [] #定义一个空列表,存放大类的数据
   for time,url,title in infos: #每一条信息都以字典样式被存入
       item = DemoItem()
       item['time']=time
       item['url']=item['url']=self.start_urls[0][:-4]+url
       item['title']=title
       items.append(item)
   print(items)
   for item in items:
       yield item #注意不是return,因为这里用到的是迭代

值得注意的是,正则表达式会将拥有三个信息的每一条新闻都会以元组的形式保存在infos这个空列表中。而demo.py的一开始即引用了上文我们定义的DemoItem类。

其次我们可以发现源代码给出的并不是完整的新闻链接,我们需要将其补全,self.start_urls表示的就是demo.py里初始类start_urls,self.start_urls [0]表示http://www.cgw.gr/news.htm,而最后的“.htm”不是我们需要的,因此使用[:-4]剔除。

我们可以在cmd终端输入scrapy crawldemo –nolognolog表示不输出日志,我们查看items列表内的内容:

接着打开pipelines.py,将每一条信息以json格式保存到result.txt文档中

import json
class DemoPipeline(object):
   f = open('result.txt', 'w', encoding='utf-8')
   def process_item(self, item, spider):
       content = json.dumps(dict(item)) +”/n”
       self.f.write(content)
       print(content)
       return item

最后我们转向settings.py,找到67-69行的内容,将其最前面的注释去掉:

当我们打开txt文档却发现,哎呀!怎么是unicode字符,而不是中文呢,这是怎么回事呢,因为scrapy抓取中文时,默认输出一般都是unicode

因此如果我们想要输出中文就必须做些改动,通过向Google寻求帮助,我们修改content这一条程序为:

content = json.dumps(dict(item),ensure_ascii=False) +"\n"

再次运行程序,我们就在txt文档中得到了我们想要的结果:



注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~


                                   


往期推文推荐:

1.爬虫俱乐部新版块--和我们一起学习Python

2.hello,MySQL--Stata连接MySQL数据库

3.hello,MySQL--odbcload读取MySQL数据

4.再爬俱乐部网站,推文目录大放送!

5.用Stata生成二维码—我的心思你来扫

6.Mata中的数据导出至Excel

7.谈谈图形中坐标设置的技巧

8.如何输出某个关键词在字符串中的所有位置?

9.想看什么书?Stata君帮你寻!——爬取中南财大图书馆书目信息

10.爬虫俱乐部隆重推出网上直播课程第一季




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存