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实现的数据结构与算法之双端队列详解
Apr 22 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
python编写微信公众号首图思路详解
Dec 13 Python
pytorch 实现查看网络中的参数
Jan 06 Python
Python底层封装实现方法详解
Jan 22 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
python selenium xpath定位操作
Sep 01 Python
Python编写单元测试代码实例
Sep 10 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
PHP的cURL库简介及使用示例
2015/02/06 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
JS实现简易计算器
2020/02/14 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
Python列表(list)常用操作方法小结
2015/02/02 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
Python栈类实例分析
2015/06/15 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
python爬虫可以爬什么
2020/06/16 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
办公室秘书自我鉴定
2014/01/18 职场文书
小学生爱国演讲稿
2014/04/25 职场文书