多线程爬取新闻标题和链接

新闻分页地址:https://news.cnblogs.com/n/page/10/;url中最后一个数字代表页码

 

from concurrent.futures import ThreadPoolExecutor
import threading
import time
from queue import Queue
import logging
import requests
from bs4 import BeautifulSoup# 日志参数的设定
FORMAT = "%(asctime)s %(threadName)s %(thread)d %(message)s"
logging.basicConfig(format=FORMAT, level=logging.INFO)# 多线程对象
event = threading.Event()# url的前缀和user-agent值的设定
base_url = 'https://news.cnblogs.com'
page_path = '/n/page/'
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'# 队列对象
urls = Queue()  # 待爬取队列,省略已爬取队列
htmls = Queue()  # 从原网页里爬取的全部html内容:太大,无用数据太多,不保存
outputs = Queue()  # 提取的数据,结果输出队列# 1.创建urls;周而复始的创建要爬取的url;start表示起始页面,stop表示终止页面
def create_urls(start, stop, step=1):for i in range(start, stop+1, step):url = "{}{}{}/".format(base_url, page_path, i)# print(url)urls.put(url)  # 将生成的url放入待爬取的url的队列里print('url创建完毕')# create_urls(1,10)  # 创建page1到page10的url
# print(urls.qsize())  # 队列的大小为10# 2.使用url来发起request请求,返回response对象
def crawler():  # 多线程while not event.is_set():try:url = urls.get(True, 1)  # 设置超时时间为1秒response = requests.get(url, headers={'User-agent': ua})with response:html = response.text  # 异步方式获取文本信息htmls.put(html)  # 将每个页面内容存放进对应的htmls队列里print('url:', url)# 捕获超时抛出的错误except Exception as e:print(e)# logging.error(e)# 3.分析提取有用的数据入库
def parse():while not event.is_set():try:html = htmls.get(True, 1) soup = BeautifulSoup(html, 'lxml')  # 解析html内容news = soup.select('h2.news_entry a')  # 提取所需标签内容for n in news:title = n.textref = base_url + n.attrs.get('href')print('get_title:', title, 'get_ref:', ref)outputs.put((title, ref))  # 提取出的标题和链接内容存放至对应队列里except Exception as e:print(e)# logging.error(e)# 4.入库;保存到文件中
def save(path):with open(path, 'a+', encoding='utf-8') as f:while not event.is_set():try:title, ref = outputs.get(True, 1)  # 元组结构print('save_title:', title, 'save_ref:', ref)f.write('{}_{}\n'.format(title, ref))f.flush()  # 爬取内容保存到文件中except Exception as e:print(e)# logging.error(e)# 线程池中,启动线程(最大线程数为10)
executor = ThreadPoolExecutor(max_workers=10)
executor.submit(create_urls, 1, 10)  # 起始urls,以后queue中parse有用的url也可以加入
executor.submit(parse)
executor.submit(save, 'news.txt')for i in range(7):executor.submit(crawler)while True:cmd = input('>>>')if cmd.strip() == 'q':  # 在console栏里输入q,就会过一秒后停止多线程运行event.set()executor.shutdown()print('closing')time.sleep(1)break

 

转载于:https://www.cnblogs.com/hongdanni/p/10573858.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15个创意示例教您如何自定义 404 错误页面

在这篇文章中,你会看到一组充满创意的404错误页面设计。我希望这个集合能够启发和帮助你设计自己的 404 错误页面。一个自定义的404错误页面将鼓励用户在您的网站上停留更长的时间。 404页面必须让访客容易理解,最好有有一些互动。你会看到下面的例子中一…

C语言反序输出英文句子,C++实现英文句子中的单词逆序输出的方法

本文实例讲述了C实现英文句子中的单词逆序输出的方法。分享给大家供大家参考,具体如下:#include "stdafx.h"#include #include #include using namespace std;int main(int arc,char** argv){string str"I come from liaoning.";sta…

r语言转化为python_数值型与字符型转换总结|R语言

在日常碰到问题时出现当前“数据类型不能进行操作”的提示时还是有些脑壳疼,所以这次整理了针对R数据类型转换的总结。理论部分主要是R for Data Science的向量节选翻译、《R语言实战》第二章2.2创建数据结构、《R in a Nutshell》以及猴子老师的向量ppt。————文…

input 输入值的监听 禁止输入特殊字符

1.input 输入值的监听 //用于监听input的值变化(input的值产生变化才会触发事件)(function ($) {$.fn.watch function (callback) {return this.each(function () {//缓存以前的值 $.data(this, originVal, $(this).val());//event $(this).on(keyu…

android 如何extends 多个,Android多线程:继承Thread类 使用解析(含实例教程)

前言在Android开发中,多线程的使用十分常见今天,我将全面解析多线程其中一种常见用法:继承Thread类。目录示意图1. 简介示意图2. 使用讲解2.1 使用步骤示意图2.2 具体使用// 步骤1:创建线程类 (继承自Thread类)class MyThread ext…

适用于Apache Hadoop 2.0 M5的Spring

Spring高兴地宣布了Spring for Apache Hadoop 2.0 M5里程碑版本,同时它们也越来越接近候选版本。 在Spring博客中 ,新版本2.0与1.0版本之间有很好的比较。 根据它: 用于Apache Hadoop的Spring 1.0版本将HDFS和MapReduce与MapReduce v1或MapR…

汇编语言 第三章小节

汇编语言第三章小结 概述: 此章节的总标题叫做 “寄存器(内存访问)”, 其教学目的是“从访问内存的角度继续学习几个寄存器“。那么,介绍了哪些寄存器呢。其一: 用来访问数据段的”DS寄存器“; 其二&#x…

激发你的灵感:16个精美视差效果网页设计作品

对于视差滚动(Parallax Scrolling),关注网页设计的朋友都不会陌生。在网页设计中,视差滚动是一种很特别的网页设计技术,通过让多层背景以不同的速度或者不同的方向移动形成 3D 运动效果,有很强的视觉冲击力…

Eclipse的Mockito模板

有时候,我想念树林里的树木-那是一段令人不安的长时间。 我最近才再次意识到这一点,在无数次中键入了一个更详细的模拟表达式。 有问题的语句是doAnswer(Answer)构造,使用涉及到的静态导入和泛型的东西进行编码总是很麻烦。 尽管我定期使用E…

【洛谷2801】教主的魔法(分块经典入门题)

点此看题面 大致题意: 给你一个序列,要你支持两种操作:第一种是区间加法,第二种是查询区间内大于等于\(x\)的数的个数。 考虑分块 这应该是一道比较经典的分块入门题吧。 首先,我们将序列分块。 对于修改操作&#xff…

cut和tr命令的联合使用

cut的-d选项只能是单个字符,而对于多个连续相同字符分隔的字段,单凭cut命令是达不到想要的效果的,特别是多个连续空格分隔时。 但借助tr -s的压缩重复字符功能,可以将多个连续空格压缩为一个空格,然后再交给cut处理就容…

使用 Web Tracing Framework 分析富 JS 应用的性能

来自谷歌的 Web Tracing Framework 包含一组工具和脚本,用于 JavaScript 相关代码的性能分析。它是重 JavaScript 应用程序的理想选择,而 JavaScript 仅用于简单的交互的网页可能没有必要。有一个手动嵌入选项和一个 Chrome 扩展,用于获取内部…

php yii2 获取表里最大的id_Yii2中自带分页类实现分页

1.首先写控制器层先引用pagination类use yiidataPagination;写自己的方法:function actionFenye(){$data Field::find(); //Field为model层,在控制器刚开始use了field这个model,这儿可以直接写Field,开头大小写都可以,为了规范,我写的是大写$pages new Pagination([totalCou…

android 操作系统升级,关于手机操作系统升级的问题

最近身边的好几个朋友问我操作系统方面问题,操作系统就是负责对计算机硬件进行直接控制以及管理的系统软件,它包含的功能也是多方面的,一般包括处理器管理,储存,文件,设备以及作业管理等等。把操作系统的内…

FindBugs Maven插件教程

FindBugs是一种静态代码分析工具,可识别从Java代码中发现的问题。 我们可以使用FindBugs Maven插件将FindBugs集成到我们的构建过程中。 这篇博客文章确定了四个典型的用例,并描述了我们如何配置FindBugs Maven插件以支持每个用例。 描述的用例是&…

Mac包管理神器Homebrew

概念 简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,相当于Red hat的yum、Ubuntu的apt-get。 安装命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 常…

网站大流量高并发访问的处理解决办法

————————目录————————- 1、硬件升级2、服务器集群、负载均衡、分布式3、CDN4、页面静态化5、缓存技术(Memcache、Redis)以上为架构层面以下为网站本地项目层面6、数据库优化 1、数据库分表技术 2、数据库读写分离 3、表建立相应的索引7、禁止盗链8、控制大文…

【完成整理】45套很酷的长影影 LOGO 设计

长阴影其实就是扩展了对象的投影,感觉是一种光线照射下的影子,通常采用角度为 45 度的投影,给对象添加了一份立体感。长阴影(Long Shadow)概念来自于最新非常流行的扁平化设计(Flat Design)。扁…

简述select语句的完整语法_SQL里的各种语句的完整语法

SQL分类:DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBA…

android 坐标点计算器,Android实现简易计算器

开之前我还是想问问老师,为什么一定要星期天前交作业呢?由于条件限制,作品是赶出来的不是细细琢磨出来的。所以在这版apk中功能较为简易,有待后期再不断更新与优化总体效果图如下布局activity_main.xml部分代码功能代码MainActivi…