工具/原料:
阿里云服务器、MobaXterm_v9.4/Xshell
实验目的:
了解云服务器、搭建虚拟环境、学习用Scrapy采集数据
主要内容:
- 搭建云服务器
- 使用远程终端软件连接到服务器
- 建立用户组
- 进入个人用户搭建虚拟环境
- 创建数据采集项目
- 定义spider(在本地用文本编辑器编辑)并上传到个人用户文件夹中
- 执行爬虫
- 保存数据
- 数据格式转换
在搭建云服务器的时候我们是小组一起做的,选择阿里云有两个原因,一个是老师用的是阿里云,选择这个可以避免在实验过程中出现不知道怎么解决的问题;另一个原因是听其他人说阿里云对于学生有优惠价格,其优惠价格对于学生来说也比较能够接受。另外,需要特别注意的是,一定要选好操作系统。我们当时忽略了我们买的云服务器自带的操作系统是CentOS 6.8 64位:
操作系统.png
但是老师给的范例都是在Ubuntu的操作系统下进行的,所以在刚开始搭环境的时候怎么做怎么不对,做了很多无用功,后来请教了大神才知道使我们的操作环境跟执行的代码是不匹配的。
在创建虚拟环境的过程中,发现使用老师给的远程终端软件MobaXterm的Session一段时间不进行操作,就老是容易断开连接,如下图所示:
1.png
在搭环境的过程中断开的话又得重新连接,然后重新输入命令,所以在搭环境的过程中动作一定要快。
本来打算复制里面的文字去百度查一查有没有什么能够解决这种问题的,结果点击Ctrl+C就关掉了搭环境的窗口,当时还完全不知道发生了什么,后来查资料才知道Ctrl+C表示强制停止当前程序,事实告诉我们:不是什么都可以用Ctrl+C进行复制的!Ctrl+C不一定就是复制的快捷键,这也告诉了我们生活中的一个小常识,那就是不是所有东西都是一成不变的。。。所以本来想要搭建环境的过程图都截下来,现在都被关掉了。。。所幸在强制关闭之前我截过一张图:
2.png
MobaXterm的Session真的一直断一直断,一退出界面查找资料的功夫就又断开连接了,实在是太麻烦了,所以经同学建议,重新下载了一个远程终端软件:Xshell。在使用的过程中发现了MobaXterm和Xshell各自的优缺点,由于一开始就是用的是MobaXterm,所以有可能是因为先入为主的原因,除了总是短时间不进行操作就会断开连接以外,界面个人觉得比Xshell更直观,而且可以自己打开文件夹直观的查看到有哪些文件,不需要输入指令去查看,但是确实老是断开连接这个问题太烦人。
由于断开了连接,所以我直接在Xshell中激活并进入之前搭好的虚拟环境即可。
3.png
在创建采集数据项目的时候出现了一点小错误:
4.png
查看代码,发现是因为我之前已经建立过这个采集数据的项目并且将py文件:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "hzz_quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1',
'http://quotes.toscrape.com/page/2',
]
for url in urls:
yield scrapy.Request(url = url, callback = self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'hzz-quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
上传到了spider文件夹中,所以可以直接进行查看了:
5.png
执行爬虫:
6.png
从代码可知,执行爬虫之后,我们得到了html文件:
7.png
找到并且保存:
8.png
但是在爬取json数据:
import scrapy
class QuotesSpider(scrapy.Spider):
name="quotes"
start_urls=[
'http://quotes.toscrape.com/page/1/',
]
def parse(self,response):
for quote in response.css('div.quote'):
yield {
'text':quote.css('span.text::text').extract_first(),
'author':quote.css('small.author::text').extract_first(),
'tags':quote.css('div.tags a.tag::text').extract(),
}
next_page=response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
next_page=response.urljoin(next_page)
yield scrapy.Request(next_page,callback=self.parse)
的时候遇到了问题,总是爬取不到数据,我仔细对过代码,询问过同学,也让同学帮忙检查了是不是哪里出错了,但是都没找出来原因是什么。
如图所示,在保存json文件的时候,一直都处于文件传输状态中,传输的大小显示的是0kb,说明并没有爬取到任何数据。
10.png
之后,我就重新创建了一个数据采集项目,然后将本地编写的Spiders文件上传到相应的文件夹中,最后执行竟然就成功了:
11.png
12.png
并且成功的爬取到了数据并且保存成了json文件:
json文件.png
最后,将json文件转化为XML文件(JSON与XML互转),然后进行了一些修改:json文件转换为XML文件
参考链接:
JSON与XML互转
Linux云服务器下配置Scrapy并抓取数据
Scrapy相关知识
我的其他文章:网站robots.txt学习笔记——以豆瓣和淘宝为例
网友评论