""" 根据提供的关键词列表,爬取天水市人民政府网站上指定日期内与关键词相关的新闻的标题,并将其存储至数据库中。 考虑到相关因素,因此本代码只爬取前10页的新闻内容,即最多100条新闻作为测试。 此方法为多线程做法,即使用多线程并行爬取网页内容,再使用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) ``` """ from concurrent.futures import ThreadPoolExecutor, as_completed import threading import util import logging from typing import List import tqdm lock = threading.Lock() @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 = [] tasks = [] with ThreadPoolExecutor(max_workers=5) as executor: for keyword in keywords: for current in range(1, 11): logging.info(f'keyword: {keyword}, current: {current}') config = spider.get_config(keyword, current) future = executor.submit(spider.fetch, config) tasks.append(future) # 更新进度条 lock.acquire() pbar.update(size) lock.release() for future in as_completed(tasks): data = future.result() title_list += spider.parse(data) 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)