python--CSDN爬虫_呼的一声飞的好远好远的博客-程序员宅基地

技术标签: 爬虫  python  threading  queue  

 

# encoding:utf-8
__author__ = 'Sun'

import re
import urllib.request
import urllib
import queue
import threading
import os


queue = queue.Queue()
visited = set()
cnt = 0
class CsdnBlogSpider(threading.Thread):

        def __init__(self, queue, opener, blog_name):
                threading.Thread.__init__(self)
                self.queue = queue
                self.opener = opener
                self.blog_name = blog_name
                self.lock = threading.Lock()

        def htmltotxt(self, data, fout):
                html = data.read().decode("utf-8")  
                html.encode("utf-8")
 
                content=re.findall('<div style=".*?">(.*?)</div>',html,re.S)
                reg=re.compile('<[^>]*>')
                fout.write(fout)
                
        def save_data(self, data, filename):
		if not os.path.exists('blog'):
			blog_path = os.path.join(os.path.abspath('.'),'blog')
			os.mkdir(blog_path)
		try:
			fout = open('./blog/' + 'lalal' + '.txt', 'wb')
			htmltotxt(data,fout)
			#fout.write(data);
		except IOError as e:
			print(e)
		# finally:
		# 	fout.close()

	def find_title(self,data):
		data = data.decode('utf-8')
		begin = data.find(r'<title') + 7
		end = data.find('\r\n',begin)
		title = data[begin:end]
		return title

	def run(self):
                global cnt
		global visited
		while True:
			url = self.queue.get()
			self.lock.acquire()
			cnt += 1
			print('已经抓取:' + str(cnt-1) + '正在抓取---->' + url)
			self.lock.release()
			try:
				res = self.opener.open(url, timeout=1000)
			except Exception as e:
				if hasattr(e, 'reason'):
					print('reason:', e.reason)
				elif hasattr(e, 'code'):
					print('error code:', e.code)
				cnt -= 1
				self.queue.task_done()
				continue
			else:
				data = res.read()
			title = self.find_title(data)
			self.save_data(data,title)

			data = data.decode('utf-8')
			blog_urls = re.compile('/' + self.blog_name + '/article/details/' + '\d*')
			for url in blog_urls.findall(data):
				url = 'http://blog.csdn.net' + url
				if url not in visited:
					self.queue.put(url)
					visited |= {url}
					# print('加入队列---》' + url)
			#当调用一次get函数之后就调用此函数,让线程阻塞或退出
			self.queue.task_done()

def init(name, number=10):
        #抓取的url个数
	global cnt
	global visited
	# blog_name = input('输入博客名称:')
	# thread_num = input('输入启动线程数:')
	blog_name = name.lower()
	th_num = int(number)
	url = 'http://blog.csdn.net/' + blog_name + '/'

	#模仿浏览器访问CSDN
	opener = urllib.request.build_opener(urllib.request.HTTPHandler)
	headers = [
		('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko')
	]
	urllib.request.install_opener(opener)
	opener.addheaders = headers

	queue.put(url)
	visited |= {url}
	cnt = 0

	for i in range(th_num):
		t = CsdnBlogSpider(queue,opener,blog_name)
		t.setDaemon(True)
		t.start()
	queue.join()
	print('--------end!!!-----')
	print('共抓取:' + str(cnt))

if __name__ == '__main__':
	init("xiaoxiaoCYG")

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36767247/article/details/82313660

智能推荐

mybatis-generator手动生成模板代码步骤_gonghaiyu的博客-程序员宅基地_generator模板

package com.tcl.database.generate;import com.google.common.base.CaseFormat;import freemarker.template.TemplateExceptionHandler;import org.apache.commons.lang3.StringUtils;import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.

python显示gif图片_Python给gif图片加文字水印_weixin_39610415的博客-程序员宅基地

为了成批地给图像增加水印,我们这里用到了枕头模块。它的英文名为pillow。安装它的方式为用cmd命令打开DOS提示符窗口,然后输入pip install pillow即可。就像下面这样:python如何安装pillow模块安装好了pillow模块后,就能使用里面的类或者子模块等了。为了能给图片增加水印,我们需要导入 Image类 、ImageFont类、ImageDraw类、ImageSeque...

Java异常及相关处理_啥也不懂的咸鱼的博客-程序员宅基地_java 文件相关异常

1.Throwable的两类子类2.Java Error类与Exception类的区别3.Exception的checked异常和unchecked异常4.异常处理的两种方式5.RuntimeException类的五个子类6.异常中的throws声明与throw语句的区别7.finally子句的作用...

R语言数据挖掘相关包的介绍_水煮鱼的博客的博客-程序员宅基地

今天发现一个很不错的博客(http://www.RDataMining.com),博主致力于研究R语言在数据挖掘方面的应用下面列出了可用于数据挖掘的R包和函数的集合。其中一些不是专门为了数据挖掘而开发,但数据挖掘过程中这些包能帮我们不少忙,所以也包含进来。1、聚类常用的包: fpc,cluster,pvclust,mclust基于划分的方法: kmean

Mirai僵尸网络+DDoS 攻击+常用端口号大全_发型资深Dan的博客-程序员宅基地_ddos攻击端口

21/tcp FTP 文件传输协议22/tcp SSH 安全登录、文件传送(SCP)和端口重定向23/tcp Telnet 不安全的文本传送25/tcp SMTP Simple Mail Transfer Protocol (E-mail)69/udp TFTP Trivial File Transfer Protocol79/tcp finger Finger80/tcp HTTP 超文本传送协议 (WWW)88/tcp Kerberos Authenticating agent110/t

网络安全kali渗透学习 web渗透入门 Google搜索引擎的使用技巧_学神来啦的博客-程序员宅基地_kali搜索引擎

Google搜索引擎的使用技巧我们通常使用搜索引擎都是直接搜索自己想要的内容,正常情况下我们都是直接使用语言进行描述问题来进行搜索,然后搜索引擎也有特定语法可以使用,熟练掌握搜索引擎的语法可以让你的搜索效率和准确率大幅度提升,当然我们学习这种技巧是为了寻找存在漏洞的页面,或者存在敏感信息的文件。这篇文章教大家如何使用Google搜索引擎以下有视频版还有文字版不知道怎么操作的请看文字版的,里面详细的步骤。关注公众号侠盗男爵回复【kali系统】视频版↓:网络安全kali/web安全/渗透测试/-小

随便推点

SAE 存取文件_骑单车的男人的博客-程序员宅基地

今天在研究PHP和微信后台系统调用的时候发现一个问题,在调用微信接口取得用户数据头像图片的时候,有一个url地址,于是我直接用 src 指向这个地址,结果万恶的腾讯设置了盗链,使真正的图片显示不出来。后来我搜了很多关于破解盗链的,还是不行,于是我就想,那干脆将图片存在服务器上,然后IMG指向服务器目录,因为我是用的SAE来做站点,后来发现在调用 file_put_contents 时,

struts2.2+hibernate3.2+spring2.5整合所需要的包_ningxinghai的博客-程序员宅基地

S2SH主要包S2SH附件包:主要是依赖包以上是S2SH框架整合时所包含的包,测试可用哦

JAVA-高频面试题汇总:数组(下)_喜欢敲代码的Apollo的博客-程序员宅基地

前言为了让小伙伴们更好地刷题,我将所有leetcode常考题按照知识点进行了归纳。高频题汇总:JAVA-高频面试题汇总:动态规划JAVA-高频面试题汇总:字符串JAVA-高频面试题汇总:二叉树(上)JAVA-高频面试题汇总:二叉树(下)JAVA-高频面试题汇总:回溯JAVA-高频面试题汇总:链表JAVA-高频面试题汇总:数组(上)JAVA-高频面试题汇总:数组(下)接下来还会进行其他模块的总结,有一起在准备暑期实习的JAVA后端的伙伴可以一起交流!小编微信: Apollo___qua

python 图片自动分类机_自动为照片添加日期并且分类的小程序_weixin_39628160的博客-程序员宅基地

小时候没怎么照相,所以跟别人说小时候特别帅他们都不信。小外甥女出生了,我给买了个照相机,让她多照相。可惜他舅目前还是个屌丝,买了个700的屌丝照相机,竟然没有自动加日期的功能。试了几个小软件,都不好用,大的图像软件咱又不会用。身为一个计算机科学与技术专业的学生,只能自立更生了。听说Python有个图形库,不错,在照片上打日期很容易,于是我就下了这个库。对Python不熟,一面看着手册一面写的。完成...

html简单设置textarea回车换行的方法应用!_weixin_33938733的博客-程序员宅基地

在实际的项目开发中,我们需要输入文本,这样在html的input文本框,远远不能满足我们实际的需求,而采用文本编辑器插件又太过于复杂,所以有时候我们使用textarea来实现文本输入!那么怎么实现后台Enter换行在前台显示换行操作呢?首先在页面显示的换行其实是一个&lt;br/&gt;而我们输入Enter换行输入的事一个\n所以我...

GUI编程学习_kiriaya的博客-程序员宅基地

告诉大家该怎么学? 这是什么? 它怎么玩? 该如何在我们平时运用? 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 1、简介Gui的核心技术:Swing AWT。缺点: 界面不美观。 需要jre环境! 为什么我们要学习 可以写出自己心中想要的一些小工具 工作时候,也可能需要维护到swing界面 .

推荐文章

热门文章

相关标签