Python实现爬虫从网络上下载文档的实例代码


Posted in Python onJune 13, 2018

最近在学习Python,自然接触到了爬虫,写了一个小型爬虫软件,从初始Url解析网页,使用正则获取待爬取链接,使用beautifulsoup解析获取文本,使用自己写的输出器可以将文本输出保存,具体代码如下:

Spider_main.py

# coding:utf8
from baike_spider import url_manager, html_downloader, html_parser, html_outputer
class SpiderMain(object):
  def __init__(self):
    self.urls = url_manager.UrlManager()
    self.downloader = html_downloader.HtmlDownloader()
    self.parser = html_parser.HtmlParser()
    self.outputer = html_outputer.HtmlOutputer()
  def craw(self, root_url):
    count = 1
    self.urls.add_new_url(root_url)
    while self.urls.has_new_url():
      print("self.urls.has %s" % self.urls.new_urls)
      try:
        new_url = self.urls.get_new_url()
        print("craw %d : %s"%(count, new_url))
        html_cont = self.downloader.download(new_url)
        new_urls, new_data = self.parser.parse(new_url, html_cont)
        self.urls.add_new_urls(new_urls)
        self.outputer.collect_data(new_data)
        if count == 1000:
          break
        count = count + 1
      except:
        print("craw failed")
    self.outputer.output_html()
    self.outputer.output_txt()
if __name__ == '__main__':
  root_url = "http://www.shushu8.com/jiangnan/longzu2qianzhuan/1"
  obj_spider = SpiderMain()
  obj_spider.craw(root_url)

url_manager.py

class UrlManager(object):
  def __init__(self):
    self.new_urls = set()
    self.old_urls = set()
  def add_new_url(self, url):
    print(url)
    if url is None:
      return
    if url not in self.new_urls and url not in self.old_urls:
      self.new_urls.add(url)
  def has_new_url(self):
    return len(self.new_urls) != 0
  def get_new_url(self):
    new_url = self.new_urls.pop()
    self.old_urls.add(new_url)
    # print('new url is %s' % new_url)
    return new_url
  def add_new_urls(self, urls):
    print("add_new_urls %s" % urls)
    if urls is None or len(urls) == 0:
      return
    for url in urls:
      self.add_new_url(url)
      print(url)

html_parser.py

import re
import urllib.parse
from bs4 import BeautifulSoup
class HtmlParser(object):
  def parse(self, page_url, html_cont):
    if page_url is None or html_cont is None:
      return
    soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8')
    new_urls = self._get_new_urls(page_url, soup)
    print("parse new_urls %s" % new_urls)
    new_data = self._get_new_data(page_url, soup)
    return new_urls, new_data
  def _get_new_data(self, page_url, soup):
    res_data = {}
    res_data['url'] = page_url
    print(page_url)
    title_node = soup.find(class_="title").find("h1")
    print(title_node.get_text())
    res_data['title'] = title_node.get_text()
    print("_get_new_data")
    summary_node = soup.find('pre')
    print(summary_node.get_text())
    res_data['summary'] = summary_node.get_text()
    return res_data
  def _get_new_urls(self, page_url, soup):
    new_urls = set()
    links = soup.find_all('a', href=re.compile(r"/jiangnan/"))
    print(links)
    for link in links:
      new_url = link['href']
      new_full_url = urllib.parse.urljoin(page_url, new_url)
      new_urls.add(new_full_url)
      # print(new_full_url)
    return new_urls

html_downloader.py

import urllib.request
class HtmlDownloader(object):
  def download(self, url):
    if url is None:
      return None
    response = urllib.request.urlopen(url)
    if response.getcode() != 200:
      return None
    return response.read()

html_outputer.py

class HtmlOutputer(object):
  def __init__(self):
    self.datas = []
  def collect_data(self, data):
    if data is None:
      return
    self.datas.append(data)
  def output_txt(self):
    fout = open('output.txt', 'w', encoding='utf-8')
    for data in self.datas:
      fout.write('%s \n' % data['title'])
      fout.write('%s \n' % data['summary'])
  def output_html(self):
    fout = open('output.html', 'w', encoding='utf-8')
    fout.write('<html>')
    fout.write('<body>')
    fout.write('<table>')
    for data in self.datas:
      fout.write('<tr>')
      fout.write('<td>%s</td>' % data['url'])
      fout.write('<td>%s</td>' % data['title'])
      fout.write('<td>%s</td>' % data['summary'])
      fout.write('</tr>')
    fout.write('</table>')
    fout.write('</body>')
    fout.write('</html>')
    fout.close()

总结

以上所述是小编给大家介绍的Python实现爬虫从网络上下载文档的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python 深入理解yield
Sep 06 Python
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
Python浅拷贝与深拷贝用法实例
May 09 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
python机器学习之随机森林(七)
Mar 26 Python
python实现textrank关键词提取
Jun 22 Python
python使用zip将list转为json的方法
Dec 31 Python
用python做游戏的细节详解
Jun 25 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 Python
Python Opencv图像处理基本操作代码详解
Aug 31 Python
Python3.9新特性详解
Oct 10 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
Pycharm导入Python包,模块的图文教程
Jun 13 #Python
mac下pycharm设置python版本的图文教程
Jun 13 #Python
使用Python来开发微信功能
Jun 13 #Python
python爬取足球直播吧五大联赛积分榜
Jun 13 #Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 #Python
mac 安装python网络请求包requests方法
Jun 13 #Python
Scrapy基于selenium结合爬取淘宝的实例讲解
Jun 13 #Python
You might like
如何选购合适的收音机
2021/03/01 无线电
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
PHP7.0版本备注
2015/07/23 PHP
详谈PHP编码转换问题
2015/07/28 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
JavaScript 乱码问题
2009/08/06 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
[08:42]DOTA2每周TOP10 精彩击杀集锦vol.2
2014/06/25 DOTA
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
pyv8学习python和javascript变量进行交互
2013/12/04 Python
Python设计模式之观察者模式实例
2014/04/26 Python
Python 中的with关键字使用详解
2016/09/11 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
2019/06/13 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
全球性的女装店:storets
2019/06/12 全球购物
翻译学院毕业生自荐书
2014/02/02 职场文书
2014年法制宣传日活动方案
2014/11/02 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫