用scrapy框架翻页爬取考研信息并存储到csv和mongdb中
时间: 2024-03-28 21:38:17 浏览: 78
好的,使用 Scrapy 框架可以更加方便地进行翻页和数据抓取,同时也可以将数据存储到 MongoDB 中。下面是一个示例代码,可以爬取研招网的考研信息并将数据存储到 csv 文件和 MongoDB 中。
首先,需要在终端中使用以下命令创建一个 Scrapy 项目:
```
scrapy startproject kaoyan_info
```
然后,在项目的 kaoyan_info/items.py 文件中定义数据结构,如下所示:
```
import scrapy
class KaoyanInfoItem(scrapy.Item):
school = scrapy.Field()
major = scrapy.Field()
category = scrapy.Field()
plan_num = scrapy.Field()
enroll_num = scrapy.Field()
```
接着,在项目的 kaoyan_info/settings.py 文件中添加以下配置,用于将数据存储到 MongoDB 中:
```
MONGODB_SERVER = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'kaoyan_db'
MONGODB_COLLECTION = 'kaoyan_collection'
ITEM_PIPELINES = {
'kaoyan_info.pipelines.KaoyanInfoPipeline': 300,
}
```
然后,在项目的 kaoyan_info/pipelines.py 文件中添加以下代码,用于将数据存储到 MongoDB 中:
```
import pymongo
from itemadapter import ItemAdapter
class KaoyanInfoPipeline:
def __init__(self, mongo_uri, mongo_db, mongo_collection):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
self.mongo_collection = mongo_collection
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGODB_SERVER'),
mongo_db=crawler.settings.get('MONGODB_DB'),
mongo_collection=crawler.settings.get('MONGODB_COLLECTION')
)
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):
self.db[self.mongo_collection].insert_one(ItemAdapter(item).asdict())
return item
```
接下来,在项目的 kaoyan_info/spiders 目录下创建一个名为 kaoyan_spider.py 的文件,并将以下代码复制进去:
```
import scrapy
from scrapy.selector import Selector
from scrapy.http import FormRequest
from kaoyan_info.items import KaoyanInfoItem
import csv
class KaoyanSpider(scrapy.Spider):
name = 'kaoyan'
allowed_domains = ['yz.chsi.com.cn']
start_urls = ['https://yz.chsi.com.cn/zsml/queryAction.do']
def parse(self, response):
# 设置查询条件
formdata = {
'ssdm': '',
'yjxkdm': '',
'yjxkdmValue': '',
'zymc': '',
'xxfs': '',
'pageno': '1'
}
yield FormRequest.from_response(response, formdata=formdata, callback=self.parse_result)
def parse_result(self, response):
# 解析查询结果
sel = Selector(response)
rows = sel.xpath('//table[@class="zsml-table"]/tr')
for row in rows[1:]:
cols = row.xpath('.//td/text()').extract()
item = KaoyanInfoItem()
item['school'] = cols[0].strip()
item['major'] = cols[1].strip()
item['category'] = cols[2].strip()
item['plan_num'] = cols[3].strip()
item['enroll_num'] = cols[4].strip()
yield item
# 翻页
params = {
'ssdm': '',
'yjxkdm': '',
'yjxkdmValue': '',
'zymc': '',
'xxfs': '',
'pageno': str(int(response.request.meta['page']) + 1)
}
yield FormRequest.from_response(response, formdata=params, callback=self.parse_result, meta={'page': params['pageno']})
def closed(self, reason):
# 保存数据到 csv 文件
with open('kaoyan.csv', 'w', newline='') as csvfile:
fieldnames = ['school', 'major', 'category', 'plan_num', 'enroll_num']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for item in self.items:
writer.writerow(item)
# 保存数据到 MongoDB 中
for item in self.items:
self.mongo_collection.insert_one(ItemAdapter(item).asdict())
```
这个爬虫会自动翻页,将每一页的查询结果解析出来,并将数据存储到一个 csv 文件和 MongoDB 中。你可以在项目的根目录下运行以下命令来运行爬虫:
```
scrapy crawl kaoyan
```
最后,当爬虫运行结束时,会自动将抓取到的数据保存到 kaoyan.csv 文件和 MongoDB 中。
阅读全文