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图像常规操作
Nov 11 Python
通过Pandas读取大文件的实例
Jun 07 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
Tensorflow tf.tile()的用法实例分析
May 22 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
python自动从arxiv下载paper的示例代码
Dec 05 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Oct 16 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中的字符串函数
2006/11/24 PHP
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
详解Document.Cookie
2015/12/25 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
Python引用模块和查找模块路径
2016/03/17 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
Django 框架模型操作入门教程
2019/11/05 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
编辑硕士自荐信范文
2013/11/27 职场文书
执行力心得体会
2013/12/31 职场文书
安全技术说明书
2014/05/09 职场文书
本科生就业推荐信
2014/05/19 职场文书
技术经济专业求职信
2014/09/03 职场文书
2016年教代会开幕词
2016/03/04 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python