简单爬虫框架实现

目录

框架流程

调度器

url管理器

网页下载器

网页解析器

数据处理器

具体演示效果

框架流程

调度器

#导入模块

import Url_Manager

import parser_html

import html_output

import download

class SpiderMain(object):

def __init__(self):

#实例化:url管理器,网页下载器,网页解析器,数据输出

self.urls=Url_Manager.UrlManager()

self.parser=parser_html.Htmlparser()

self.download = download.download()

self.outputer=html_output.HtmlOutputer()

def craw(self,root_url):

count=1

#向列表里面添加新的单个url

self.urls.add_new_url(root_url)

#判断待爬取的url列表里面有没有新的url

while self.urls.has_new_url():

try:

#如果待爬取的url列表不为空,则取一个url出来

new_url=self.urls.get_new_url()

print('craw %d:%s' % (count,new_url))

#下载网页

html_cont=self.download.download(new_url)

#解析网页

#解析获得两个数据:新的url,以及我们要获取的数据

new_urls,new_data=self.parser.parse(new_url,html_cont)

#获取的url添加到待爬取的url列表

self.urls.add_new_urls(new_urls)

#保存数据

self.outputer.collect_data(new_data)

#如果下载的url页面达到50个,结束当前循环

if count ==50:

break

count=count+1

except:

print('craw failed')

#输出数据

self.outputer.output_html()

if __name__ == '__main__':

#开始爬取的url

url = "http://www.dili360.com/gallery/"

root_url=url

#实例化

obj_spider=SpiderMain()

obj_spider.craw(root_url)

url管理器

#url管理器需要四个方法:

#add_new_url:向管理器添加单个url

#add_new_url:向管理器添加批量的url

#has_new_url:判断管理器里面是否有新的在爬取的url

#get_new_url:在管理器中获取一个正在爬取的url

#url管理器需要维护两个列表:待爬取的url,已经爬取的url

class UrlManager(object):

def __init__(self):

#待爬取的url列表

self.new_urls=set()

#已经爬取的url列表

self.old_urls=set()

#向管理器添加单个url

def add_new_url(self,url):

#首先判断url是否为空

if url is None:

return

#如果这个url既不在待爬取的url里面也没有在已经爬取的url里面,则说明这是一个新url

if url not in self.new_urls and url not in self.old_urls:

self.new_urls.add(url)

# 向管理器添加批量的url

def add_new_urls(self,urls):

if urls is None or len(urls) ==0:

return

for url in urls:

self.add_new_url(url)

#判断管理器里面是否有新的在爬取的url

def has_new_url(self):

return len(self.new_urls) != 0

# 获取一个正在爬取的url

def get_new_url(self):

new_url = self.new_urls.pop()

self.old_urls.add(new_url)

return new_url

网页下载器

import requests

class download(object):

def download(self,url):

if url is None:

return None

else:

response = requests.get(url)

if response.status_code !=200:

return None

return response.text

网页解析器

from urllib.parse import urljoin

from bs4 import BeautifulSoup

class Htmlparser(object):

def _get_new_urls(self,page_url,soup):

new_urls = set()

#这里可以加上正则表达式,对url进行过滤

links=soup.find_all('a')

for link in links:

#补全url,添加到列表里面

new_url=link['href']

new_full_url=urljoin(page_url,new_url)

new_urls.add(new_full_url)

return new_urls

def _get_new_data(self,page_url,soup):

#解析数据,由用户来编写

new_datas=set()

imgs=soup.find_all('img')

for img in imgs:

new_data=img['src']

new_full_data=new_data

new_datas.add(new_full_data)

return new_datas

#需要解析出新的url和数据

def parse(self,page_url,html_cont):

if page_url is None or html_cont is None:

return

soup=BeautifulSoup(html_cont,'html.parser')

#调用两个本地方法:解析新的url以及解析数据

new_urls=self._get_new_urls(page_url,soup)

new_data = self._get_new_data(page_url,soup)

return new_urls,new_data

# 报错:

# UserWarning: You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.

# 解决方法:

# soup = BeautifulSoup(html_doc,"html.parser")

# 这一句中删除【from_encoding="utf-8"】

# 原因:

# python3 缺省的编码是unicode, 再在from_encoding设置为utf8, 会被忽视掉,去掉【from_encoding="utf-8"】这一个好了

数据处理器

使用文档保存文本信息

使用文件保存图片,视频文件等,可进行扩展

class HtmlOutputer(object):

def __init__(self):

self.datas=[]

def collect_data(self,data):

if data is None:

return

self.datas.append(data)

def output_html(self):

fout=open('output','a+')

for data in self.datas:

for da in data:

fout.write(str(da)+'\n')

fout.close()

具体演示效果

演示url:http://www.dili360.com/gallery/

演示过程:

数据处理:

python爬虫网站简单_Python爬虫之简单爬虫框架实现相关推荐

  1. python视频网站项目_Python超羽量级灵活框架 Flask实战微电影视频网站 大小项目通吃 Flask实战项目...

    课程名称: Python超羽量级灵活框架 Flask实战微电影视频网站 大小项目通吃 Flask实战项目视频教程 课程简介: Flask作为Python编写的Web小型框架,可以使用Python快速开 ...

  2. python在线翻译代码_Python 20行简单实现有道在线翻译的详解

    简介 主要是尝试简单的使用pyhton的爬虫功能,于是使用有道进行尝试,并没有进行深入的诸如相关api的调用. 以下是需要的POST数据 代码 以下是相关部分的代码: import urllib.re ...

  3. python测试网站功能_Python检测网站链接是否已存在

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl语言一样, Pyt ...

  4. python实现简单爬虫百度首页_python使用百度进行爬虫简单学习例子

    root@kali:~/py# python table.py list: ['http://www.baidu.com/s?wd=python&pn=10&oq=python& ...

  5. python获取网站代码_python爬虫1——获取网站源代码(豆瓣图书top250信息)

    # -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...

  6. 爬虫python下载网站所有图片_python爬虫(4):多页图片批量下载-澎湃网信息图...

    澎湃网文章的质量不错,它的"美数课"栏目的信息图做得也很好.图片干货多还能带来ppt和图表制作的技巧.为了更方便浏览所有文章图片,通过分析Ajax爬取栏目至今所有信息图的图片. 但 ...

  7. python 爬网站 实例_python爬虫实战:之爬取京东商城实例教程!(含源代码)

    前言: 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1 ...

  8. 爬虫python下载网站所有图片_Python爬虫之下载网页图片

    传统的方式是在想要的图片上鼠标点击右键另存为,或者用截图的方式保存图片,其实我们还可以通过使用简单的Python语言实现图片的下载并保存到本地,下面让我们看看如何实现吧 一.确定图片的URL地址及获取 ...

  9. python怎么爬虫理数据_Python神技能 | 使用爬虫获取汽车之家全车型数据

    最近想在工作相关的项目上做技术改进,需要全而准的车型数据,寻寻觅觅而不得,所以就只能自己动手丰衣足食,到网上获(窃)得(取)数据了. 汽车之家是大家公认的数据做的比较好的汽车网站,所以就用它吧.(感谢 ...

  10. python web游戏实例_python实现的简单文本类游戏实例

    Python应用与实践 Python应用与实践 目录 1.      Python是什么? 1.1.      Python语言 1.2.      Python哲学 2.      Python在工 ...

最新文章

  1. Java项目:车租赁管理系统(java+Gui+文档)
  2. GitHub 上有哪些好用的爬虫?
  3. 程序员的精力呵护指南!来自十年程序员的精力管理经验
  4. 新分享一种解决ie6下PNG图片透明的方法
  5. asp.net core 5.0的一些模块
  6. 动态规划 —— 背包问题 P02 —— 完全背包
  7. python bytes是什么类型,python中的字节串类型(bytes)
  8. python中数字类型与处理工具
  9. 微服务~Consul服务注册与发现
  10. 二十三种设计模式[4] - 原型模式(Prototype Pattern)
  11. Cocos2d-x组件的创建与挂载
  12. Centos升级GLIBC
  13. 空洞卷积(扩张卷积dilated convolution)
  14. 2017 EC-Final A Chat Grou
  15. ClickHouse 函数极简教程
  16. DeFi之道丨告别朝九晚五,一文了解区块链新组织形式DO
  17. Pytorch:lr_schedule恢复训练的注意事项
  18. 和WiFi共享精灵一起成长
  19. 大数据运维工作(Linux,OGG,链路监控,Hadoop运维等)
  20. 最新自己怎么建网站零基础教程-李廷学

热门文章

  1. tomcat 无端口号访问
  2. (xy)+((x^y)1)求(245, 112)结果是多少
  3. android touch事件坐标原点,Android – 捏缩放ontouch事件坐标
  4. 3d激光雷达开发(法向量预测)
  5. 随想录(形式化验证小结)
  6. win32开发(创建子窗口)
  7. catia文本时怎么换行_【二次开发】CATIA二维图 环形文字工具
  8. 接口里面能有构造器吗?_家用弱电箱里空空如也,装修时应该怎么在里面接线呢?能拆掉吗?...
  9. 安装两个mysql3308_在同一台机器上安装两个版本的MySQL
  10. pv原语模拟实现_HART协议压力变送器硬件设计及实现