所需工具
- 腾讯云服务器(申请地址:云服务器CVM-腾讯云 学生优惠套餐-腾讯云)
- xshell(用于与服务器远程连接)
1.搭建服务器环境
1.1远程连接服务器###
1.1.1下载安装xshell####
1.1.2与服务器建立连接####
-
下载后打开xshell,在工具栏点击【新建文件传输(Ctrl+Alt+F)】,下载xftp,跟着网页所示步骤完成下载即可。
-
新建连接,按要求输入连接名、主机IP,点击确定。
-
选中新建的连接,点击【连接】。
-
输入服务器用户名。
-
点击【浏览】→【生成】→【下一步】→填完秘钥名和密码继续【下一步】→【保存成文件】。
-
到服务器绑定秘钥
这里要先关闭服务器,再进行绑定。
绑定之后再将服务器开机。
-
进入xshell,【打开】输入密码。如下图所示,则连接成功。
1.2配置服务器环境###
1.2.1新增用户####
输入指令:sudo adduser username
输入指令:
cd /home/username
sudo usermod -aG sudo username
为用户添加sudo权限su root
提升用户权限:#是系统管理员,$是普通管理员更多指令参考Ubuntu 常用命令整理
1.2.2安装虚拟环境、各种软件包、scrapy####
2.创建数据采集项目,抓取网页源码
这里以抓取Quotes to Scrape名人名言为例。
安装好scrapy后,输入指令
scrapy startproject quotes
创建项目。-
本地编写爬虫文件
import scrapy class QuotesSpider(scrapy.Spider): name="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='quotes-%s.html'%page with open(filename,'wb') as f: f.write(response.body) self.log('Saved file %s'% filename)
这里需要非常注意,Python语言是一款对缩进非常敏感的语言,所以编写Python代码时要注意缩进,否则就会容易出现在编译时会出现这样的错误IndentationError:expected an indented block
。最常见的情况是tab和空格的混用会导致错误。所以该缩进的地方要缩进,而且不能空格与tab混用。
- 执行爬虫(若未激活)
输入指令cd /home/example/venv
进入虚拟环境
输入指令source bin/activate
激活
输入指令cd quotes
进入刚才新建的项目
输入指令cd quotes/spiders
进入spiders目录
然后将本地编写好的爬虫拖入spiders目录下(若失败,查看是否有权限#,没有su root
提高管理员权限)
输入指令scrapy crawl quotes
执行爬虫 - 下载爬虫爬取的文件
输入指令sz 文件名
下载(如不知道文件名,可使用tree
命令查看当前目录文件,tree安装指令:sudo apt-get install tree
)
3.抓取热门标签下的名人名言
对爬虫还不是非常了解,所以我在这用的是一种比较笨的方法:手动将10个热门标签对应的url放在urls列表里......
代码如下:
import scrapy
class QuotesSpider(scrapy.Spider):
name="hot_quotes"
start_urls=[
'http://quotes.toscrape.com/tag/love/',
'http://quotes.toscrape.com/tag/inspirational/',
'http://quotes.toscrape.com/tag/life/',
'http://quotes.toscrape.com/tag/humor/',
'http://quotes.toscrape.com/tag/books/',
'http://quotes.toscrape.com/tag/reading/',
'http://quotes.toscrape.com/tag/friendship/',
'http://quotes.toscrape.com/tag/friends/',
'http://quotes.toscrape.com/tag/truth/',
'http://quotes.toscrape.com/tag/simile/',
]
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)
name
是爬虫名字,这个名字必须是唯一的。
- 执行爬虫:
过程和2相同,执行指令为scrapy crawl hot_quotes -o hotquotes.json
第一个参数hot_quotes
为爬虫名字,第二个参数hotquotes.json
是你想要将爬取下来的数据存为的名字。 - 下载同2
4.json与xml互转
百度线上工具:在线XML、JSON数据互转
5.经验教训
- 学习前人的经验:前人的经验可以有效避免走弯路、走错路,大大提高学习效率,本次环境配置参考了㭍葉的过程,节省了很多时间。
- Python语法:本次运行爬虫程序时,一直出现
IndentationError:expected an indented block
错误,改了n次还是报错,最后静下心把所有缩进都统一调整,代码中该删的空格都删掉才解决问题。所以以后写Python程序时,要养成良好的习惯,避免这样的低级错误。