爬取廖雪峰的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 目的是爬取每一个教程的标题,作者,时间和 ...
随机推荐
- 【翻译】Ext JS 6有什么新东西?
工具包ToolKits 发布 包的命名 Fashion 图表 ItemEdit插件 网格 电子表格 可操作模式Actionable Mode和可访问性 LazyItems插件 屏幕阅读器支持可访问性 ...
- 时间序列分解-STL分解法
时间序列分解-STL分解法 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. STL(’Seasonal a ...
- iOS开发支付集成之支付宝支付
项目中要用到支付功能,需要支付宝,微信,银联三大支付,所以打算总结一下,写两篇文章,方便以后的查阅, 大家在做的时候也能稍微参考下,用到的地方避免再次被坑.这是第二篇支付宝集成,第一篇银联支付在这里. ...
- Android 5.0 SEAndroid下如何获得对一个内核节点的访问权限
-9]* u:object_r:tty_device:s0 # We add here /dev/wf_bt u:object_r:wf_bt_device:s0 wf_bt ...
- InfiniDB 修改一行的效率?
InfiniDB引擎的DML速度比较慢,无论设置自动提交开关为关闭或开启,插入性能都很糟糕,但更新和删除的效率还可以,并且不支持truncate表操作. 删,改 效率高 插入,效率低(测试,在数据量稍 ...
- SVM实验
说明: 1)α2=0表示第二个样例不在分类面上,在分类面上的点αi均不为零. 2)二次项矩阵,可以通过矩阵相乘相加方法得到,如上例 3)目标函数变为负值,是为了照顾matlab的标准型. 假定应用多项 ...
- 谈谈java中的线程(初级概念)
定义 关于进程与线程的定义 可参看一下这个介绍 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 在不细抠定义的情况下 ...
- 关于使用Xcode自带的单元测试UnitTest的介绍
什么是单元测试? 单元测试就是为你的方法专门多写一个测试函数.以保证你的方法在不停的修改开发中.保持正确.如果出错,第一时间让你知道,这样从最小单位开始监控来保证软件的质量. 什么时候用到单元测试: ...
- 客户端状态的存储空间——Session
http协议在设计之初被设计成无状态特性,客户端的每次请求在服务端看来都是独立且无任何相关性,同一个客户端第一次请求不会与第二次请求有任何关联,即使相隔时间很短.无状态的特性让请求变得很快速且服务器也 ...
- 《UNIX网络编程 卷1》之"学习环境搭建"(CentOS 7)
<UNIX网络编程 卷1>的源码可以从www.unpbook.com下载得到.解压之后的目录为unpv13e. 详细步骤 编译 进入unpv13e目录,按如下步骤编译: ./configu ...