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错误和解决方法汇总整理
Jun 03 Python
Python简单操作sqlite3的方法示例
Mar 22 Python
浅谈numpy生成数组的零值问题
Nov 12 Python
python实现微信自动回复机器人功能
Jul 11 Python
Python imread、newaxis用法详解
Nov 04 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
Mar 09 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
详解python的super()的作用和原理
Oct 29 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 Python
教你用python控制安卓手机
May 13 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获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
Python的Django框架中if标签的相关使用
2015/07/15 Python
python文件的md5加密方法
2016/04/06 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
介绍一下Python中webbrowser的用法
2013/05/07 面试题
任命书模板
2014/06/04 职场文书
药店促销活动总结
2014/07/10 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
python实现简单的三子棋游戏
2022/04/28 Python