要离线下载易百教程网站中的所有关于Python的教程,需要将Python教程的首页作为种子url:http://www.yiibai.com/python/,然后按照广度优先(广度优先,使用队列;深度优先,使用栈),依次爬取每一篇关于Python的文章。为了防止同一个链接重复爬取,使用集合来限制同一个链接只处理一次。
使用正则表达式提取网页源码里边的文章标题和文章url,获取到了文章的url,使用Python根据url生成html文件十分容易。


  1. import re
  2. import urllib.request
  3. import urllib
  4. from collections import deque
  5. # 保存文件的后缀
  6. SUFFIX='.html'
  7. # 提取文章标题的正则表达式
  8. REX_TITLE=r'<title>(.*?)</title>'
  9. # 提取所需链接的正则表达式
  10. REX_URL=r'/python/(.+?).html'
  11. # 种子url,从这个url开始爬取
  12. BASE_URL='http://www.yiibai.com/python/'
  13. # 将获取到的文本保存为html文件
  14. def saveHtml(file_name,file_content):
  15. #    注意windows文件命名的禁用符,比如 /
  16.     with open (file_name.replace('/','_')+SUFFIX,"wb") as f:
  17. #   写文件用bytes而不是str,所以要转码
  18.         f.write(bytes(file_content, encoding = "utf8"))
  19. #   获取文章标题
  20. def getTitle(file_content):
  21.     linkre = re.search(REX_TITLE,file_content)
  22.     if(linkre):
  23.         print('获取文章标题:'+linkre.group(1))
  24.         return linkre.group(1)
  25.  
  26. #   爬虫用到的两个数据结构,队列和集合
  27. queue = deque()
  28. visited = set()
  29. #   初始化种子链接 
  30. queue.append(BASE_URL)
  31. count = 0
  32.  
  33. while queue:
  34.   url = queue.popleft()  # 队首元素出队
  35.   visited |= {url}  # 标记为已访问
  36.  
  37.   print('已经抓取: ' + str(count) + '   正在抓取 <---  ' + url)
  38.   count += 1
  39.   urlop = urllib.request.urlopen(url)
  40.   # 只处理html链接
  41.   if 'html' not in urlop.getheader('Content-Type'):
  42.     continue
  43.  
  44.   # 避免程序异常中止
  45.   try:
  46.     data = urlop.read().decode('utf-8')
  47.     title=getTitle(data);
  48.     # 保存文件
  49.     saveHtml(title,data)
  50.   except:
  51.     continue
  52.  
  53.   # 正则表达式提取页面中所有链接, 并判断是否已经访问过, 然后加入待爬队列
  54.   linkre = re.compile(REX_URL)
  55.   for sub_link in linkre.findall(data):
  56.       sub_url=BASE_URL+sub_link+SUFFIX;
  57. # 已经访问过,不再处理
  58.       if sub_url in visited:
  59.           pass
  60.       else:
  61.           # 设置已访问
  62.           visited |= {sub_url}
  63.           # 加入队列
  64.           queue.append(sub_url)
  65.           print('加入队列 --->  ' + sub_url)

Python3爬虫之爬取某一路径的所有html文件的更多相关文章

  1. 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  2. python3 爬虫之爬取安居客二手房资讯(第一版)

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Author;Tsukasa import requests from bs4 import Beau ...

  3. python3爬虫应用--爬取网易云音乐(两种办法)

    一.需求 好久没有碰爬虫了,竟不知道从何入手.偶然看到一篇知乎的评论(https://www.zhihu.com/question/20799742/answer/99491808),一时兴起就也照葫 ...

  4. 使用htmlparse爬虫技术爬取电影网页的全部下载链接

    昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...

  5. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...

  6. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  7. 使用htmlparser爬虫技术爬取电影网页的全部下载链接

    昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...

  8. 【Python】【爬虫】爬取酷狗TOP500

    好啦好啦,那我们来拉开我们的爬虫之旅吧~~~ 这一只小爬虫是爬取酷狗TOP500的,使用的爬取手法简单粗暴,目的是帮大家初步窥探爬虫长啥样,后期会慢慢变得健壮起来的. 环境配置 在此之前需要下载一个谷 ...

  9. Python爬虫之爬取站内所有图片

    title date tags layut Python爬虫之爬取站内所有图片 2018-10-07 Python post 目标是 http://www.5442.com/meinv/ 如需在非li ...

随机推荐

  1. Vue小技巧,如何导入普通JS文件

    最近在开发一个展示3D模型的WEB程序,在工程中使用了VUE和ThreeJS库.Three.js本身是支持CommonJS的,但我们还用到了OBJLoader模块,此模块不支持CommonJS,改成C ...

  2. How to Download Windows 10 Spotlight/Lock Screen Images

    http://www.online-tech-tips.com/windows-10/download-windows-10-spotlight-lock-screen-images/ 图片位置 C: ...

  3. 继承—people

    public class People { private double height;//身高 private double weight;//体重 public double getHeight( ...

  4. OpenGL编程逐步深入(九)插值处理

    注:文中VS代指顶点着色器,FS代指片段着色器. 准备知识 这个教程和大家展示3d管道中非常重要的部分,即Interpolation(插值).光栅化程序执行的插值变量由VS产生.正如你已经见到过的,为 ...

  5. 第一性原理:First principle thinking是什么?

    作者:沧海桑田链接:https://www.zhihu.com/question/40550274/answer/225236964来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  6. linux 下 .sh 文件语法

    转自:http://blog.sina.com.cn/s/blog_54f82cc201010hfz.html 介绍: 1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh ...

  7. Ubuntu18.04 解压zip文件乱码的解决方法

    在Ubuntu的系统下解压zip文件的时候居然出现了乱码,通过查找网上的资料,解决的办法有两种 一.通过unzip行命令解压,指定字符集,由于zip格式中并没有指定编码格式,Windows下生成的zi ...

  8. 使用sysbench 对mysql进行性能测试

    使用sysbench 对mysql进行性能测试 sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有My ...

  9. Open With Atom添加到右键菜单/从右键菜单移除

    1.进入Settings 快捷键ctrl+shift+p,输入settings后回车 2.切换到System选项卡 3.通过勾选/取消勾选以下选项实现添加/移除右键菜单 √ Show in file ...

  10. PKU 3281 Dining 网络流 (抄模板)

    题意: 农夫约翰为他的牛准备了F种食物和D种饮料.每头牛都有各自喜欢的食物和饮料,而每种食物或饮料只能分配给一头牛.最多能有多少头牛可以同时得到各自喜欢的食物和饮料? 思路: 用 s -> 食物 ...