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中除法使用的注意事项
Aug 21 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
Python简单实现socket信息发送与监听功能示例
Jan 03 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
python 使用plt画图,去除图片四周的白边方法
Jul 09 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
python计算导数并绘图的实例
Feb 29 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
Python编写万花尺图案实例
Jan 03 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 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
yii2使用ajax返回json的实现方法
2016/05/14 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
如何离线执行php任务
2017/02/21 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
python实现媒体播放器功能
2018/02/11 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
一套SQL笔试题
2016/08/14 面试题
中药学自荐信
2014/06/15 职场文书
防灾减灾活动总结
2014/08/30 职场文书
师德师风自我评价范文
2014/09/11 职场文书
质量承诺书格式范文
2015/04/28 职场文书
家电创业计划书
2019/08/05 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers