从廖雪峰老师的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教程的更多相关文章

  1. Python爬虫——用BeautifulSoup、python-docx爬取廖雪峰大大的教程为word文档

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 廖雪峰大大贡献的教程写的不错,写了个爬虫把教程保存为word文件,供大家方便下载学习:http://p ...

  2. step2: 爬取廖雪峰博客

    #https://zhuanlan.zhihu.com/p/26342933 #https://zhuanlan.zhihu.com/p/26833760 scrapy startproject li ...

  3. 廖雪峰老师Python3教程练习整理

    1.定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax2 + bx + c = 0的两个解 # -*- coding: utf-8 -*-import mathde ...

  4. 廖雪峰Git入门教程

    廖雪峰Git入门教程  2018-05-24 23:05:11     0     0     0 https://www.liaoxuefeng.com/wiki/00137395163059296 ...

  5. 【js】【读书笔记】廖雪峰的js教程读书笔记

    最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...

  6. 廖雪峰的java教程

    F:\教程\0-免费下载-廖雪峰 公司电脑地址: G:\学习中\廖雪峰的java教程 廖雪峰java课程地址: https://www.feiyangedu.com/category/JavaSE 0 ...

  7. 学以致用:Python爬取廖大Python教程制作pdf

    当我学了廖大的Python教程后,感觉总得做点什么,正好自己想随时查阅,于是就开始有了制作PDF这个想法. 想要把教程变成PDF有三步: 先生成空html,爬取每一篇教程放进一个新生成的div,这样就 ...

  8. git常用命令总结--廖雪峰老师Git教程命令总结

    学习了廖雪峰老师的Git教程之后的命令总结,重点关于git和远程仓库的东西. 如果没有学过,这是传送门 下面这个图很重要 一.git初始化本地仓库和配置 echo "想输入到文件的内容,一般 ...

  9. scrapy爬取微信小程序社区教程(crawlspider)

    爬取的目标网站是: http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1 目的是爬取每一个教程的标题,作者,时间和 ...

随机推荐

  1. IMX51---GPIO

    GPIO(General Purpose Input/Output)指通用输入/输出,IMX51的GPIO模块提供32位双向的.通用输入和输出的信号,下图是GPIO的框图: 图1 1.      GP ...

  2. 在go中使用json作为主要的配置格式

    最近在用go重构,在先前的代码中,我们使用的ini文件进行配置,但是因为很多历史遗留问题,导致配置混乱,维护困难,自然也需要考虑重构了. 通用配置格式 通用的配置格式有很多,常用的就有ini,json ...

  3. Android原生嵌入React Native

    1.首先集成的项目目录 我使用的是直接按照react-native init Project 的格式来导入的,也就是说,我的Android项目目录是跟node_modules是在一个目录下的. 我们i ...

  4. GDAL书籍

    GDAL的书籍经过快两年的编写修改,终于出版发行了,有需要的同学可以到下面的网址进行购买. 购买地址: 亚马逊:http://www.amazon.cn/GDAL%E6%BA%90%E7%A0%81% ...

  5. (NO.00003)iOS游戏简单的机器人投射游戏成形记(八)

    回到Xcode,新建ArmStatic类,继承于CCSprite.同样在初始化方法中打开用户交互. 下面添加触摸回调方法,touchBegan以及touchMoved方法和Arm基本相同,主要不同处在 ...

  6. 07_Android操作sqllite数据库(包括2中方式操作数据的方式),单元测试,BaseAdapter的使用,自定义view的综合使用案例

     1 目标从sqllite中读取数据并显示如下: MainActivity对应的界面 MainActivity2对应的界面           2  配置Android的清单文件 <?xml ...

  7. memcached /usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

    启动memcached的时候发现找不到libevent的库,这是memcache的默认查找路径不包含libevent的安装路径,所以要告诉memcached去哪里查找libevent. 操作命令如下: ...

  8. Linux下编译GDAL

    一.准备工作 从官网下载GDAL.PROJ.4和GEOS,将其存放在/home/liml/Work/3rdPart目录并解压,如下图所示.下载地址请自行Google.注:使用的系统是CentOS6.4 ...

  9. SpriteBuilder中粒子发射器的reset on visibility toggle选项解释

    如果选中该选择框,表示粒子发射器将删除所有已存在的粒子当它们的可见状态被代码改变的时候. 如果该选择框没有选中,则发射器将保持产生粒子但不渲染它们(意思是有但你看不到)当它们的可视状态为NO的时候. ...

  10. 计算机编码方式详解(Unicode、UTF-8、UTF-16、ASCII)

    整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的"另存为",可以在GBK.Unicode.Unicode big endian和UTF-8这几种编码方式间相互转 ...