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中执行shell命令的几个方法小结
Sep 18 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
Nov 06 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
python抓取搜狗微信公众号文章
Apr 01 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
Python中turtle库的使用实例
Sep 09 Python
基于python的列表list和集合set操作
Nov 24 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
python中的yield from语法快速学习
Nov 06 Python
Python OpenCV 图像平移的实现示例
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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
PHP 写文本日志实现代码
2010/05/18 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
半角全角相互转换的js函数
2009/10/16 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
Python map和reduce函数用法示例
2015/02/26 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
Python Socket传输文件示例
2017/01/16 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
python实现的发邮件功能示例
2019/09/11 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
介绍一下linux的文件权限
2014/07/20 面试题
酒店总经理欢迎词
2014/01/08 职场文书
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
小学体育教学反思
2014/01/31 职场文书
五年级音乐教学反思
2014/02/06 职场文书
新兵入伍心得体会
2014/09/04 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
商场营业员岗位职责
2015/04/14 职场文书
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
python中super()函数的理解与基本使用
2021/08/30 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python