又开新坑了,最近迷上了爬虫,塞尔达,数据结构。。。时间不够用了已经。
近几天简单的学习了Scrapy这个框架,简单好用;
第一步 准备工作
1、安装(基于python3.x环境)
pip3 install scrapy
2、安装pycharm
建议购买正版。。。
3、下载MongoDB和它的GUI工具 下载链接;
4、安装pymongo
pip3 install pymongo
安装完毕之后 终端输入 mongod 启动数据库服务;
2017-04-28T10:32:43.344+0800 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2017-04-28T10:32:43.345+0800 I NETWORK [thread1] waiting for connections on port 27017
开始
简单介绍下Scrapy
简单使用主要需要了解三个文件;
1、items.py
主要用来接收和暂时保存爬取到的数据
2、spider
主要负责爬取数据
3、pipelines.py
如果需要存入数据库,在这个文件中操作
爬取数据
目标:爬取最美应用网页端的APP数据
1、打开终端
scrapy startproject zhuimei
2、使用 pyCharm打开工程
其中main.py 需要自己创建,为后面调试做准备
3、接下来需要将zhuimei文件夹设置为Sources Root 以便pycharm查找module;
右击文件夹按下面图操作
4、打开items.py,文件中已经存在一个和项目同名的Item,可以使用也可以重新声明一个类;
在文件中声明一个类 zuimeiItem;
class zuimeiItem(scrapy.Item):
id = Field() # 每个APP的id编号
title = Field() #APP 大标题
subtitle = Field() #副标题
url = Field() #下载链接
date = Field() #时间
5、在Spiders文件夹下新建文件zuimeispider.py
导入
from scrapy import Spider,Request
from scrapy import Selector
from zhuimei.items import zuimeiItem
声明一个类继承于Spider
class ZuiMeiSpider(Spider):
name = "zuimei" #启动爬虫时以这个名为准
allowd_domains = ["http://www.zuimeia.com"]
start_urls = ['http://www.zuimeia.com']
接下来解析我们爬取到的数据
利用火狐浏览器的 firebug 和 firepath插件来审查页面
通过审查我们可以看到 app的title是存储在 一个类名为“app-title”的标签下面的h1标签下,所以我们使用Xpath获取文字
sel = Selector(response)
title_list = sel.xpath(".//*[@class='app-title']/h1/text()").extract()
同理获取到副标题,时间和下载链接
subtitle_list = sel.xpath(".//*[@class='sub-title']/text()").extract()
date_list = sel.xpath(".//*[@class='pub-time']/text()").extract()
url_list = sel.xpath(".//*[@class='detail-icon']/@href").extract()
最后将获取到的数据用item接收保存
for title,subtitle,date,url in zip(title_list,subtitle_list,date_list,url_list):
item = zuimeiItem()
item["id"] = url[5:9]
item["title"] = title
item["subtitle"] = subtitle
item["date"] = date
item["url"] = self.allowd_domains[0] + url #下载需要拼接成完整的url
yield item
可以在上述代码中添加 print,输出爬取到的数据
到这步结束,我们就可以启动爬虫,爬取数据了可以选择两个方法
1、直接打开终端,进入到项目目录下
scrapy crawl zuimei
2、在新建的main.py中
from scrapy import cmdline
cmdline.execute("scrapy crawl zuimei".split())
打开 Run下的Edit Configurations
新建一个 python,并把main.py的路径添加到Script;
现在可以直接使用pycharm的debug功能了;
两种方法其实原理上相同;
将数据存入数据库
1、打开settings.py文件
#取消注释
ITEM_PIPELINES = {
'zhuimei.pipelines.ZhuimeiPipeline': 300,
}
#添加下面代码
MONGODB_HOST = '127.0.0.1'
MONGODB_PORT = 27017
#本地数据库的名字可以自己起,这边直接使用 MongoDB自带
MONGODB_DBNAME = 'local'
2、打开pipelines.py ,添加下面代码
class ZhuimeiPipeline(object):
def __init__(self):
host = settings['MONGODB_HOST']
port = settings['MONGODB_PORT']
dbName = settings['MONGODB_DBNAME']
client = pymongo.MongoClient(host=host, port=port)
db = client[dbName]
self.post = db["zuimei"] # 连接表,表需要在MongoDB compass 中创建
def process_item(self, item, spider):
appInfo = dict(item)
#防止数据重复存入
self.post.update({'id':item['id']},{'$set':dict(item)},True)
return item
3、确认数据库服务已经启动
打开MongoDB Compass, connect;
在 local数据库中新建表 zuimei,注意这里一定要和pipelines中表名一致
4、启动爬虫,待程序运行结束后
结语
这只是个简单的爬虫,只能爬取当前页面的数据,后面我会补全翻页抓取的操作。