一、框架初识
爬虫项目的半成品:常见爬虫功能的代码已经实现好了,留下一些接口,根据需求变动少量代码部分,并根据需求去调用这些接口,完成一个爬虫项目
我这里主要用的是开源的scrapy框架。
二、Scrapy框架简介
Scrapy框架是一套比较成熟的Python爬虫框架,是使用Python开发的快速、高层次的信息爬取框架,可以高效的爬取Web页面并提取出我们关注的结构化的数据
Scrapy框架的应用领域很多,如网络爬虫开发、数据挖掘、数据监测、自动化测试
三、Scrapy进行爬虫项目开发
1、安装完scrapy之后在命令窗口中输入:
C:\Users\admin>D:
D:\>cd Python\myweb
D:\Python\myweb>
D:\Python\myweb>scrapy startproject acadpjt(项目名称)
D:\Python\myweb>cd myfirstpjt
D:\Python\myweb\myfirstpjt>
2、使用genspider命令来创建Scrapy爬虫文件
使用该命令可以基于现有的爬虫模板直接生成一个新的爬虫文件
#查看可以使用的爬虫模板
D:\Python\myweb\myfirstpjt>scrapy genspider -l
Available templates:
basic
crawl
csvfeed
xmlfeed
#这里使用basic模板创建一个爬虫文件
D:\Python\myweb\myfirstpjt>scrapy genspider -t basic acahe(爬虫文件名) casad.cas.cn(网站域名)
3、目录结构如下所示
四、Scrapy核心架构
结合核心架构对目录结构进行说明
项目下的相关文件
(1)_ init _.py:为项目的初始化文件,主要写一些项目的初始化信息
(2)settings.py:设置文件,主要为爬虫项目的一些设置信息
(3)items.py:数据容器文件,主要定义我们要获取的数据
(4)pipelines.py:管道文件,主要对items定义的数据进行进一步的加工和处理
spider项目下的相关文件
(1)_ init _.py:爬虫部分的初始化文件,主要对spiders进行初始化
(2)acahe.py:爬虫文件,所有的爬虫文件都继承scrapy.Spider,爬虫文件是非常重要的部分,所有进行的爬取动作以及数据的提取都是在该文件中进行的
五、项目实例
1、首先进行items的编写
我们想要获取什么样的信息,如网页标题,网页关键词、网页地址
这里我想要获取各个院士的姓名name,以及姓名所对应的主页的链接地址link
所以在items.py文件中定义:
import scrapy
class AcadpjtItem(scrapy.Item):
name=scrapy.Field()
link=scrapy.Field()
2、进行piplines的编写
编写好items.py的文件之后,还需要对爬取到的数据做进一步的处理,比如存储到json文件中,可以通过编写pipelines.py文件实现。
import json
import codecs
class AcadpjtPipeline(object):
def __init__(self):
#打开mydata.json文件
self.file=codecs.open("D:/Python/acadpjt/acadpjt/mydata.json","wb",encoding="utf-8")
def process_item(self, item, spider):
i = json.dumps(dict(item), ensure_ascii=False)
#每条数据之后加上换行
line = i+'\n'
#将数据写入到json文件之中
self.file.write(line)
return item
def close_spider(self,spider):
self.file.close()
3、settings文件的编写
pipelines默认是关闭的,所以需要在settings文件中开启
#去掉该部分的ITEM_PIPELINES的注释
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'acadpjt.pipelines.AcadpjtPipeline': 300,
}
避免该网站的服务器通过我们的cookie识别我们的爬虫行为,所以设置实现关闭cookie的操作
设置如下,去掉部分注释
# Disable cookies (enabled by default)
COOKIES_ENABLED = False
4、最后对爬虫文件acahe.py进行编写(最重要的一部分)
import scrapy
from acadpjt.items import AcadpjtItem
from scrapy.http import Request
class AcaheSpider(scrapy.Spider):
#爬虫的名称
name = 'acahe'
#允许爬行的域名
allowed_domains = ['casad.cas.cn']
#爬行的起始网址,可以有多个网址可以用逗号隔开
start_urls = ['http://www.casad.cas.cn/chnl/371/index.html']
def parse(self, response):
#首先实例化AcadpjtItem,并且赋值给item
item=AcadpjtItem()
#然后通过XPath表达式提取我们需要的内容
item["name"] = response.xpath("//span/a/text()").extract()
item["link"] = response.xpath("//span/a/@href").extract()
#将item交给pipeline进行处理
yield item
parse函数中,yield返回,如果是request则加入爬取队列,如果是item类型则使用pipeline处理,其他类型则返回错误信息。