""" 根据提供的关键词列表,爬取天水市人民政府网站上指定日期内与关键词相关的新闻的标题,并将其存储至数据库中。 考虑到相关因素,因此本代码只爬取前10页的新闻内容,即最多100条新闻作为测试。 此方法为协程做法,即使用gevent库通过协程并发爬取网页内容,再使用json提取新闻内容。 注意:本代码中的关键词列表默认为['灾害'],日期范围默认为2018年1月1日至2018年12月31日。 Args: keywords: 用于搜索新闻的关键词列表 begin_date: 开始日期,用于搜索 end_date: 结束日期,用于搜索 size: 一次请求返回的新闻或政策的最大数量 Examples: ``` main(keywords=['灾害'], begin_date='2018-01-01', end_date='2018-12-31', size=10) ``` """ import gevent from gevent import monkey # 打补丁,使标准库能够与gevent协同工作 monkey.patch_all() import util import logging from typing import List import tqdm @util.timeit def main(keywords: List[str], begin_date: str, end_date: str, size: int = 10): """ 爬取与提供的关键词列表相关的新闻. Args: keywords: 用于搜索新闻的关键词列表 begin_date: 开始日期,用于搜索 end_date: 结束日期,用于搜索 size: 一次请求返回的新闻或政策的最大数量 """ logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", filename='log.txt', encoding='utf-8') logging.info("开始运行协程爬取") spider = util.Spider(keywords=keywords, begin_date=begin_date, end_date=end_date, size=size) pbar = tqdm.tqdm(total=size * 10, desc='协程爬取进度', unit='条', ncols=80) title_list = [] def fetch_and_parse(keyword, current): logging.info(f'keyword: {keyword}, current: {current}') config = spider.get_config(keyword, current) data = spider.fetch(config) titles = spider.parse(data) title_list.extend(titles) pbar.update(size) jobs = [ gevent.spawn(fetch_and_parse, keyword, current) for keyword in keywords for current in range(1, 11) ] gevent.joinall(jobs) spider.save(title_list) pbar.close() logging.info("爬取完成") if __name__ == "__main__": main(keywords=['灾害'], begin_date='2018-01-01', end_date='2018-12-31', size=10)