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爬虫之HTTP异常处理
Nov 05 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
Python爬虫模拟登录带验证码网站
Jan 22 Python
Python实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
python删除不需要的python文件方法
Apr 24 Python
Python字符串逆序的实现方法【一题多解】
Feb 18 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
Python笔试面试题小结
Sep 07 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
基于python修改srt字幕的时间轴
Feb 03 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
php array_map()数组函数使用说明
2011/07/12 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
实例讲解PHP表单
2020/06/10 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
Python实现LRU算法的2种方法
2015/06/24 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
如何基于python测量代码运行时间
2019/12/25 Python
如何用python写个模板引擎
2021/01/14 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
英国假睫毛购买网站:FalseEyelashes.co.uk
2018/05/23 全球购物
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
逻辑链路控制协议
2016/10/01 面试题
Java程序员综合测试题
2014/04/25 面试题
高级护理实习生自荐信
2013/09/28 职场文书
汽车工程专业应届生求职信
2013/10/19 职场文书
岗位职责怎么写
2014/03/14 职场文书
社区义诊活动总结
2014/04/30 职场文书
高中信息技术教学反思
2016/02/16 职场文书