• 使用python实现简单爬虫


    简单的爬虫架构

    调度器

    URL管理器

    管理待抓取的URL集合和已抓取的URL,防止重复抓取,防止死循环

    功能列表

    1:判断新添加URL是否在容器中
    2:向管理器添加新URL
    3:判断容器是否为空
    4:将已爬取URL移动到已爬取集合
    5:获取待爬取URL
    

    实现方式

    1:使用set(自动去除重复项目)
    2:使用关系数据库(MySQL)
    3:使用缓存数据库(redis):大型公司使用这玩意
    

    网页下载器

    功能列表

    1:get 
    2:post
    3:伪装头信息
    4:HTTPCookieProcessor
    5:ProxyHandler
    6:HTTPSHandler
    7:HTTPRedirectHAndler
    

    实现方法

    1:urllib2
    2:URLlib3
    3:requests
    

    此处使用request实现

    #coding=utf-8
    import requests,json
    
    url = 'http://www.baidu.com'
    headers = {'user-agent':'Mozilla/5.0'}	#模拟Mozilla浏览器头,此行可以为空
    get_data = {'wd':'linux'}
    r = requests.get(url,headers=headers,params = get_data)
    
    if r.status_code == 200:
    	'访问成功'
    	try:
    		file = open('baidu.com','w')
    		file.write('本次访问网址是:' + r.url)
    		print('本次访问网址是:' + r.url)
    	except IOError as e:
    		print('文件读取错误:' + str(e))
    
    	try:
    		file = open('baidu.com','a+')
    		text = r.text
    		file.write('
    得到数据如下:
    ' + text)
    		print('得到数据长度:' + str(len(r.content)))
    	except IOError as e:
    		print('文件读取错误:' + str(e))
    else:
    	print('我是假的404')
    

    解析器

    1:正则表达式			传统经典,语法奇葩难懂
    2:html.parser		python自带
    3:BeautifulSoup		可以使用上下两种解析器,集合天地精华
    4:lxml				可以解析html和xml
    
    
    #coding=utf-8
    from bs4 import BeautifulSoup,re
    
    try:
    	file = open('baidu.com','r')
    	html_str = file.read()
    	print(type(html_str))
    except IOError as e:
    	print(str(e))
    finally:
    	if 'file' in locals():
    		file.close()
    
    if 'html_str' in locals():
    	#根据HTML网页字符串创建BeautifulSoup对象
    	soup = BeautifulSoup(
    		html_str,				#html文档字符串
    		'html.parser',			#html解析器,可以使用py自带的html_parser
    		from_encoding='utf-8'	#文档编码格式
    		)
    
    
    	#soup.find(name,attrs,string)	#只查找第一个匹配对象,支持正则表达式
    	nodes = soup.find_all('a')
    	for node in nodes:
    		print(node.name)			#得到节点标签(参数1)
    		print(node['href'])			#得到属性(参数2)
    		print(node.get_text())		#得到文字(参数3)
    
    	#正则匹配
    	nodes2 = soup.find_all('a',href=re.compile(r"map"))
    	print('
    
    
    
    
    ---------------------------百年分割线------------------------
    ')
    	for node in nodes2:
    		print(node.name)			#得到节点标签(参数1)
    		print(node['href'])			#得到属性(参数2)
    		print(node.get_text())		#得到文字(参数3)
  • 相关阅读:
    unity-疑难杂症(一)
    unity-【UI】点击交互(一)
    asp.net core 附加进程调试、指令等
    几种定时器(timer)的区别
    ObjectDisplay 对象属性展示 Display
    IEnumerable,ICollection,IList,List 比较
    Excel等格式文件从服务端调用导出
    Azure DevOps 与VS 2019
    从 数据库表 生成 项目实体 文件
    Border样式
  • 原文地址:https://www.cnblogs.com/cenzhongman/p/6914400.html
Copyright © 2020-2023  润新知