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函数any()和all()的用法及区别介绍
Sep 14 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
python 实现将Numpy数组保存为图像
Jan 09 Python
Python底层封装实现方法详解
Jan 22 Python
django 实现简单的插入视频
Apr 07 Python
python破解同事的压缩包密码
Oct 14 Python
python pymysql库的常用操作
Oct 16 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 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
用header 发送cookie的php代码
2007/03/16 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
jquery validate.js表单验证入门实例(附源码)
2015/11/10 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
用python实现刷点击率的示例代码
2019/02/21 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
python实现手机销售管理系统
2019/03/19 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
劳动竞赛活动总结
2014/05/05 职场文书
护士节策划方案
2014/05/19 职场文书
党员志愿者活动总结
2014/06/26 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
自主招生自荐信格式
2015/03/04 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS
Win10系统下配置Java环境变量
2021/06/13 Java/Android
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android