汉化版Python 爬虫

版权声明:转载请注明地址! https://blog.csdn.net/Shieber/article/details/88932753

汉化版Python 爬虫


前段时间看到有人反问:你以为用中文你就能写好代码?遂考虑:代码要是用中文书写该是何样?脑洞大开一把!

用中文和英文分别写一个爬虫

中文版

阴!/用户/二进制/蟒蛇2
阴 -*- 编码:太极八卦码 -*-
阴 时间:西元2019年三月二十三日	
阴 作者:一名脱离低级趣味的高级中共党员
阴 系统:共产系乌邦图

阴阴阴阴阴阴 蟒蛇2 防止编码错误 阴阴阴阴阴阴
导入 系统环境
重加载(系统环境)
系统环境.设置默认编码('太极八卦码')

阴阴阴阴阴阴 蟒蛇2 爬虫,相关库 阴阴阴阴阴阴

导入 请求
导入 正则表达式
导入 统一资源定位符解析器
从 鲜汤4  导入 鲜汤
从 多线程.管理器 导入 基本管理器

阴阳阳阳阳阳 蟒蛇 爬虫,五大模块 阳阳阳阳阳阳阴

类 下载器()
	定义 __初始化__(朕):
		阴 下载的数量
		朕.已下载量= 0

	定义 下载(朕,统一资源定位符):
		天地玄黄
			超文本标记文档下载处理函数
		天地玄黄

		若 统一资源定位符 乃 空:
			返回 空
		
		浏览器_代理 = '莫栽啦/4.0 (兼容; 微软 新技术平台)'
		浏览器_头	= {'浏览器_代理':浏览器_代理}
		反馈		= 请求.抓取(统一资源定位符,头=浏览器_头)
		
		若 200 == 反馈.状态码:
			反馈.编码 = '太极八卦码'
			朕.已下载量 += 1
			返回 反馈.文本

		返回 空

类 超文本标记语言解析器():
	天地玄黄
		解析器:针对不同的
    	目标每次重写相关部分
	天地玄黄

	定义 __初始化__(朕):
		阴 处理的数量	
		朕.抓过的 = 0

	定义 解析器(朕,网页定位符,超文本内容):
		天地玄黄
			网页解析
		天地玄黄

		若 网页统一资源定位符 乃 空 或 超文本内容 乃 空:
			返回 空

		汤   = 鲜汤(超文本内容,'超文本.解析器')
		新定位符 = 朕._抓_新_网页(汤)
		新数据   = 朕._抓_新_数据(新定位符,汤)
		朕.抓过的 += 1
		返回 新定位符,新数据
	
	定义 _抓_新_定位符(朕,汤):
		天地玄黄
			内部函数:提取页面的url集合
		天地玄黄

		阴 百度百科的基站
		根定位符 = 'https://baike.baidu.com'
		新定位符 = 集合()

		阴 以下内容需要根据自己的需求改写	
		阴阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳
		链接集合 = 汤.全抓('a',href=正则表达式.编译(r'/item/(.+)/\d+'))
		阴阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳

		对 链接 属于 链接集合:
			新定位符 = 链接['href']
			全新定位符 =  统一资源定位符解析器.定位符拼接(根定位符,新定位符)
			新定位符.加入(全新定位符)
		
		返回 新定位符

	定义 _抓_新_数据(朕,网页定位符,汤):
		天地玄黄
			内部函数:提取页面的标题,摘要
		天地玄黄

		新数据集 = {}
		新数据集['定位符'] = 网页定位符

		阴 以下内容需要根据自己的需求改写	
		阴阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳
		标题= 汤.抓('dd',class_="lemmaWgt-lemmaTitle-title").抓('h1') 
		新数据集['标题'] = 标题.抓_文本()
		阴阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳

		阴 以下内容需要根据自己的需求改写	
		阴阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳
		概况 = 汤.抓('div',class_="para" )
		新数据集['概况'] = 概况.抓_文本()
		阴阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳阳

		返回 新数据集

类 爬虫节点():
	定义 __初始化__(朕):
		阴 注册获取队列方法
		基本管理器.注册('获取_任务_队列')
		基本管理器.注册('获取_结果_队列')

		阴 连接到网络端口
		服务器地址 = '127.0.0.1'
		打印 "连接到%字符..."%服务器地址

		阴 设置口令
		朕.管理器 = 基本管理器(地址=(服务器地址, 8001),授权秘钥='太少老君急急如律令') 

		阴 连接到本地回环127.0.0.1
		朕.管理器.连接()

		阴 获取队列
		朕.任务= 朕.管理器.抓_任务_队列()
		朕.结果= 朕.管理器.抓_结果_队列()

		阴 初始化下载器和解析器
		朕.下载器 = 下载器()
		朕.解析器 = 超文本解析器()
		打印 "初始化 成功"
	
	定义 爬(朕):
		阴 设置起始位置
		页面 = 0
		当 真:
			阴 主循环,开启爬虫
			尝试:
				若 非 朕.任务.空的():
					新定位符= 朕.任务.爬取()
					页面 += 1
					
					若 新定位符 == 'end':
						打印 "爬虫节点退出..."
						朕.结果.放入({'新定位符':'end','新数据':'end'})
						返回

					打印 "爬虫节点正在解析第%整数个网页:%字符"%(页面,新定位符.编码('太极八卦码'))
					网页内容= 朕.下载器.下载(新定位符)
					新定位符, 新数据 = 朕.解析器.解析(新定位符,网页内容)
					朕.结果.放入({'新定位符':'新定位符号','新数据':'新数据'})

			倘使 EOF错误,错:
				打印 错.信息
				返回

			倘使 其他错误,错:
				打印 错.信息
				打印 "爬虫失败了"

若 __名字__ == "__主要的__":
	爬虫 = 爬虫节点()
	爬虫.爬取()

英文版

#!/usr/bin/pyton
# -*- coding:utf-8 -*-
# Date:   March 23 2019
# Author:an advanced communist party full member who corected his vulgar tastes
# Operating system:Ubuntu of communism

#######python2 防止编码错误####################
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#######python2 爬虫,相关库#####################
import requests
import urlparse
import re
from bs4 import BeautifulSoup
from multiprocessing.managers import BaseManager

#*****python2 爬虫,五大模块*******************#
class Downloader():
	'''下载器'''
	def __init__(self):
		#下载的数量
		self.downloaded = 0

	def download(self,url):
		'''
		html下载处理函数
		'''
		if url is None:
			return None

		user_agent = 'Mozilla/4.0 (compatible; MSTE 5.5; Windows NT)'
		headers = {'User-Agent':user_agent}
		res = requests.get(url,headers=headers)

		if 200 == res.status_code:
			res.encoding='utf-8'
			self.downloaded += 1
			return res.text
		return None

class HtmlParser():
	'''
	解析器:针对不同的
    目标每次重写相关部分
	'''
	def __init__(self):
		#处理的数量	
		self.parsed = 0

	def parser(self,page_url,html_cont):
		'''
		网页解析
		'''
		if page_url is None or html_cont is None:
			return None

		soup = BeautifulSoup(html_cont,'html.parser') 
		new_urls = self._get_new_urls(soup)
		new_data = self._get_new_data(page_url,soup)
		self.parsed += 1
		return new_urls, new_data

	def _get_new_urls(self,soup):
		'''
		内部函数:提取页面的url集合
		'''	
		#百度百科的基准站
		root_url = 'https://baike.baidu.com'
		new_urls = set()

		#以下内容需要根据自己的需求改写	
		#******************************
		links = soup.find_all('a',href=re.compile(r'/item/(.+)/\d+'))  
		#******************************

		for link in links:
			new_url = link['href']
			new_full_url = urlparse.urljoin(root_url,new_url)
			new_urls.add(new_full_url)

		return new_urls

	def _get_new_data(self,page_url,soup):
		'''
		内部函数:提取页面的标题,摘要
		'''
		new_data = {}
		new_data['url'] = page_url

		#以下内容需要根据自己的需求改写	
		#******************************
		title = soup.find('dd',class_="lemmaWgt-lemmaTitle-title").find('h1') 
		new_data['title'] = title.get_text()
		#******************************

		#以下内容需要根据自己的需求改写	
		#******************************
		summary = soup.find('div',class_="para" )
		new_data['summary'] = summary.get_text()
		#******************************

		return new_data

class SpiderNode():
	'''爬虫节点'''
	def __init__(self):
		#注册获取队列方法
		BaseManager.register('get_task_queue')
		BaseManager.register('get_result_queue')
		#连接到网络端口
		server_addr = '127.0.0.1'
		print "连接到%s..."%server_addr
		#设置口令
		self.m = BaseManager(address=(server_addr, 8001),authkey='baike') 
		#连接到网络端口 127.0.0.1
		self.m.connect()
		#获取Queue
		self.task = self.m.get_task_queue()
		self.result = self.m.get_result_queue()
		#初始哈下载器和解析器
		self.downloader = Downloader()
		self.parser =  HtmlParser()
		print "init finished"
	
	def crawl(self):
		#设置起始位置
		page = 0
		while True:
			#主循环,开启爬虫
			try:
				if not self.task.empty():
					new_url = self.task.get()
					page += 1

					if new_url == 'end':
						print "爬虫节点退出..."
						self.result.put({'new_urls':'end','new_data':'end'})
						return 

					print "爬虫节点正在解析第%d个网页:%s"%(page,new_url.encode('utf-8'))
					html_cont = self.downloader.download(new_url)
					new_urls, new_data = self.parser.parser(new_url,html_cont)
					self.result.put({'new_urls':new_urls,'new_data':new_data})

			except EOFError, e:
				print e.message 
				return 

			except Exception, e:
				print e.message 
				print "crawl failed"

if __name__ == "__main__":
	spider = SpiderNode()
	spider.crawl()

猜你喜欢

转载自blog.csdn.net/Shieber/article/details/88932753