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使用PyCharm进行远程开发和调试
Nov 02 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
Python实现的多进程和多线程功能示例
May 29 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
对Python中plt的画图函数详解
Nov 07 Python
对PyQt5的输入对话框使用(QInputDialog)详解
Jun 25 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
基于python实现蓝牙通信代码实例
Nov 19 Python
python第三方库学习笔记
Feb 07 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
python可迭代对象去重实例
May 15 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 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
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php跨服务器访问方法小结
2015/05/12 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
php中this关键字用法分析
2016/12/07 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
JsRender for object语法简介
2014/10/31 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python爬虫可以爬什么
2020/06/16 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
在职人员函授期间自我评价分享
2013/11/08 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
片区教研活动总结
2014/07/02 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技