互联网中的数据具有非常大的使用价值,同时数据种类也繁多,对于需要做数据分析等应用时,就需要做数据采集和清洗等等,那么目前使用scrapy爬虫框架可以很方便的进行互联网数据爬取,让数据产生价值。
这里只是介绍下简单的使用过程,可以快速的了解和简单的应用,详细的介绍和使用可以参考官方文档:https://docs.scrapy.org/en/latest/intro/tutorial.html
环境
安装
使用PyCharm创建一个Python的工程,后面的操作都是在venv中环境开发
1
2
|
# 使用pip直接安装
pip install Scrapy
|
创建项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 在PyCharm的创建的工程根目录中,输入下面的命令
# 创建book的一个项目,名字可以自定义
scrapy startproject book
# 创建完成后的目录结构如下:
book/
scrapy.cfg # 部署配置文件
book/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
middlewares.py # project middlewares file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
|
创建任务
1
2
3
4
|
# 还是在目录中输入以下命令:
scrapy genspider spider名称 '爬取的域名'
# 创建的spider会在 spiders的目录下
|
基本配置
根据自己的需求修改settings.py 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
|
FEED_EXPORT_ENCODING = 'utf-8'
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}
ITEM_PIPELINES = {
'suzhou.pipelines.MongoPipeline': 300,
}
|
高级应用
处理Item,可以在中间件中加入一个存储件:下面看下简单的mongodb的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
import pymongo
from suzhou.items import SuzhouItem, SuzhouList
class MongoPipeline:
collection_name = 'suzhou'
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
# 用来过滤不同的item做什么的事情
if isinstance(item, SuzhouItem):
self.collection_name = 'suzhou'
elif isinstance(item, SuzhouList):
self.collection_name = 'sz'
self.db[self.collection_name].replace_one({'url': item['url']}, dict(item), upsert=True)
return item
|
开始执行
1
2
|
# 执行爬取任务的命令
scrapy crawl spider的名称
|
提示
获取配置信息
方式一:
1
2
3
4
5
|
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
settings.get('')
|
方式二:
继承scrapy.Spider这个类的可以直接使用内部的字段
方式三:其他等等
序列化
1
2
3
4
5
|
# 序列化对象到json字符串
json.dumps(item, default=lambda obj: obj.__dict__)
# 序列化json到python对象
json.loads(str(error))
|
mongodb
1
2
3
4
5
6
|
# 客户端连接
client = pymongo.MongoClient(settings.get('MONGO_URI'))
# 获取数据库
db = client[settings.get('MONGO_DATABASE')]
# 集合的数据插入和更新操作,upsert=True,如果存在就更新,不存在就插入
db['error'].replace_one({'url': item.url}, json.loads(str(error)), upsert=True)
|
结尾
大家还是做友好的公民,用相关技术去爬取允许和公开的数据,做一些有有意义的事情。