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 实现红包随机生成算法的简单实例
Jan 04 Python
Python AES加密模块用法分析
May 22 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 Python
想学python 这5本书籍你必看!
Dec 11 Python
详解用Python练习画个美队盾牌
Mar 23 Python
PIL图像处理模块paste方法简单使用详解
Jul 17 Python
简单了解django orm中介模型
Jul 30 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
python实现引用其他路径包里面的模块
Mar 09 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
Jun 04 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
JS实现按钮控制计时开始和停止功能
2017/07/27 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
python 获取域名到期时间的方法步骤
2021/02/10 Python
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
英国儿童图书网站:Scholastic
2017/03/26 全球购物
天巡全球:Skyscanner Global
2017/06/20 全球购物
Linux文件操作命令都有哪些
2015/02/27 面试题
《要下雨了》教学反思
2014/02/17 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
Python进度条的使用
2021/05/17 Python
PyTorch 如何自动计算梯度
2021/05/23 Python