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 相关文章推荐
详解Django框架中用户的登录和退出的实现
Jul 23 Python
深入理解python中的select模块
Apr 23 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
python 显示数组全部元素的方法
Apr 19 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
python爬取微信公众号文章的方法
Feb 26 Python
python中pygame安装过程(超级详细)
Aug 04 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
如何理解Python中包的引入
May 29 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
python办公自动化之excel的操作
May 23 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 tp验证表单与自动填充函数代码
2012/02/22 PHP
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
解析php入库和出库
2013/06/25 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
Javascript 圆角div的实现代码
2009/10/15 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
教学质量月活动总结
2015/05/11 职场文书
2019年教师节活动策划方案
2019/09/09 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP