爬取廖雪峰的python3教程
从廖雪峰老师的python教程入门的,最近在看python爬虫,入手了一下
代码比较low,没有用到多线程和ip代理池
然后呢,由于robots.txt的限定,构建了一些user-agent,并放慢的爬虫的速度,起到一些效果,可能多次抓取才能完成所有文章~~~
仅供一些刚入门的同学参考一下........
用到的库及工具:(自行百度)
1.BeautifulSoup4
2.pdfkit
3.requests
4.wkhtmltopdf(需添加环境变量)
代码如下:
# -*- coding:utf-8 -*- # @author:lijinxi # @file: __init__.py.py # @time: 2018/05/07 import requests from bs4 import BeautifulSoup import pdfkit import time import os import re import random class Crawel(object): def __init__(self): self.htmlTemplate = ''' <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> {content} </body> </html> ''' # robots.txt不允许,设置请求头 user_agent=[ "Mozilla / 5.0(Windows NT 10.0;Win64; x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 66.0.3359.139,Safari / 537.36", "Mozilla / 5.0(Windows NT 10.0;Win64; x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 58.0.3029.110Safari / 537.36 Edge / 16.16299", " Mozilla / 5.0(WindowsNT10.0;WOW64;Trident / 7.0;LCTE;rv: 11.0) likeGecko", "Mozilla / 5.0(Windows NT 10.0;Win64;x64;rv: 59.0) Gecko / 20100101Firefox / 59.0", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" ] self.headers = { "Proxy-Connection": "keep-alive", "Pragma": "no-cache", "Cache-Control": "no-cache", "User - Agent": (user_agent[random.randint(0,len(user_agent)-1)]), "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", ", "Accept-Encoding": "gzip, deflate, sdch", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4", "Accept-Charset": "gb2312,gbk;q=0.7,utf-8;q=0.7,*;q=0.7", "Referer": "https: // www.liaoxuefeng.com /", } def getPageLinks(self): ''' 获取所有的URL集合 :return: ''' response = requests.get("https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000", headers=self.headers) bsObj = BeautifulSoup(response.text, "lxml") menu_list = bsObj.find("ul", {"id": "x-wiki-index", "class": "uk-nav uk-nav-side"}) pageLinks = [] for pageLink in menu_list.findAll("a", {"class": "x-wiki-index-item"}): if pageLink.attrs["href"] is not None: newLink = "https://www.liaoxuefeng.com" + pageLink.attrs["href"] pageLinks.append(newLink) return pageLinks def getUrlContent(self, url, file): ''' 解析URL,获取HTML内容 :param url: :param file:保存的html 文件名 :return: ''' response = requests.get(url, headers=self.headers) bsObj = BeautifulSoup(response.text, "lxml") # 正文 pageContent = bsObj.find("div", {"class": "x-wiki-content x-main-content"}) # 标题 pageTitle = bsObj.find("h4").get_text() # 标题放在正文之前居中显示 center_tag = bsObj.new_tag("center") title_tag = bsObj.new_tag("h1") title_tag.string = pageTitle center_tag.insert(1, title_tag) pageContent.insert(0, center_tag) html = str(pageContent) html = self.htmlTemplate.format(content=html) html = html.encode("utf-8") with open(file, 'wb+') as f: f.write(html) return file def sloveImage(self, filename1, filename2): ''' 解决图片不能正常保存的问题 由路径引起,尝试修改路径 :param filename1:原始文件 :param filename2:修改后要保存的文件 :return: ''' with open(filename1, "rb+") as f: text = f.read().decode("utf-8") text = text.replace("data-src", "src") with open(filename2, "wb+") as f: f.write(text.encode("utf-8")) return filename2 def savePdf(self, htmls, filename): ''' 将所有的html保存到pdf文件 :param htmls: :param filename: :return: ''' options = { 'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'custom-header': [ ('Accept-Encoding', 'gzip') ], 'cookie': [ ('cookie-name1', 'cookie-value1'), ('cookie-name2', 'cookie-value2'), ], 'outline-depth': 10, } pdfkit.from_file(htmls, filename, options=options) def main(): ''' 处理 :return: ''' start = time.time() crawer = Crawel() filename = "liaoxuefeng_blogs_python3.pdf" pageLinks = crawer.getPageLinks() htmls = [] # html文件列表 for index, pageLink in enumerate(pageLinks): if index<18: continue filename1 = "index" + str(index) + ".html" filename2 = "indexc" + str(index) + ".html" crawer.getUrlContent(pageLink, filename1) waittime=random.randint(0,20)+20; time.sleep(waittime) # 给自己留一线生机 html = crawer.sloveImage(filename1, filename2) htmls.append(html) print("第%d页采集完成........." % index) crawer.savePdf(htmls, filename) # 移除html文件 '''' rex = re.compile("^index.*\.html$") for i in os.listdir(): if rex.match(i): os.remove(i) ''' total_time = time.time() - start print("总共运行了%d秒" % total_time) if __name__ == '__main__': main()
进一步完善中..........................^<>^
爬取廖雪峰的python3教程的更多相关文章
- Python爬虫——用BeautifulSoup、python-docx爬取廖雪峰大大的教程为word文档
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 廖雪峰大大贡献的教程写的不错,写了个爬虫把教程保存为word文件,供大家方便下载学习:http://p ...
- step2: 爬取廖雪峰博客
#https://zhuanlan.zhihu.com/p/26342933 #https://zhuanlan.zhihu.com/p/26833760 scrapy startproject li ...
- 廖雪峰老师Python3教程练习整理
1.定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax2 + bx + c = 0的两个解 # -*- coding: utf-8 -*-import mathde ...
- 廖雪峰Git入门教程
廖雪峰Git入门教程 2018-05-24 23:05:11 0 0 0 https://www.liaoxuefeng.com/wiki/00137395163059296 ...
- 【js】【读书笔记】廖雪峰的js教程读书笔记
最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...
- 廖雪峰的java教程
F:\教程\0-免费下载-廖雪峰 公司电脑地址: G:\学习中\廖雪峰的java教程 廖雪峰java课程地址: https://www.feiyangedu.com/category/JavaSE 0 ...
- 学以致用:Python爬取廖大Python教程制作pdf
当我学了廖大的Python教程后,感觉总得做点什么,正好自己想随时查阅,于是就开始有了制作PDF这个想法. 想要把教程变成PDF有三步: 先生成空html,爬取每一篇教程放进一个新生成的div,这样就 ...
- git常用命令总结--廖雪峰老师Git教程命令总结
学习了廖雪峰老师的Git教程之后的命令总结,重点关于git和远程仓库的东西. 如果没有学过,这是传送门 下面这个图很重要 一.git初始化本地仓库和配置 echo "想输入到文件的内容,一般 ...
- scrapy爬取微信小程序社区教程(crawlspider)
爬取的目标网站是: http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1 目的是爬取每一个教程的标题,作者,时间和 ...
随机推荐
- iOS模仿京东商城中的选择地区样式
在ViewController文件中创建添加地址界面: @property(nonatomic,strong)UILabel *selectAreaLabel;//地区显示@property(nona ...
- linux下重启weblogic(关闭和启动)
ssh远程连接Linux服务器! 开启weblogic: 1.找到/Oracle/Middleware/user_projects/domains/用户_domain目录, 2.执行nohup ...
- Android ToggleButton 实践
在android的开发过程中,对于ToggleButton的使用频率也是相当的高的,下面我就来说一下,这个组件的两种使用方式. 第一种是简单的使用,利用Toast的方式弹出提示语句 需要注意的是要想自 ...
- HTML5 在<a>标签内放置块级元素
原文地址:HTML5: Wrap Block-Level Elements with A's 原文日期: 2010年06月26日 翻译日期: 2013年08月22日 对比起XHTML来说,HTML5通 ...
- Dynamics CRM2013 任务列表添加自定义按钮
任务列表的command bar 上面添加自定义按钮如下 要注意的是此处的列表不是任务实体而是活动实体,如果你是在任务实体的home栏上面加那你永远看不见按钮的显示,但如果是要在任务的表单界面上加按钮 ...
- 【Android 应用开发】Android 平台 HTTP网速测试 案例 API 分析
作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/25996817 工信部规定的网速测试标准 : 除普通网页测速 ...
- linux shell (()) 双括号运算符使用
估计很多朋友都感觉比较难以接受.特变逻辑运算符"[]"使用时候,必须保证运算符与算数 之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(( ...
- wordpress入门基础:wordpress文件系统结构详细介绍
根目录|| wp-admin — wp-content — wp-includes| | |___________________________________ ...
- Android View底层到底是怎么绘制的
Android绘制链图: 网上很多讲Android view的绘制流程往往只讲到了Measure - Layout - Draw. 但是,这只是一个大体的流程,而我们需要探讨的是Android在我们 ...
- 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)
最近在看linux内核的进程调度算法,也写了不少的内核注释,也参考了鸿哥的单片机框架,代码注释就开源在我的CSDN的git代码库里,有兴趣的可以去瞧瞧. 突发奇想,想到了既然单片机能够实现,那么我用标 ...