爬图书馆电子资源

爬图书馆电子资源


佳哥的怒吼

佳哥一声哀怨:“为何只能下载前4页!”

我扭过头去,发现佳哥正在看着某个神秘的电子书,再定睛一看,这不是浏览器嘛。原来佳哥在图书馆里找到了宝贝,而这可恨的设定只能下载4页,这不坑爹么!!
于是我右键审查了一下图书馆的阅读页面属性:

<div id="Readweb" style="height: 762px; overflow: auto;">

原来如此,简单的把id=”Readweb”的div取出来就行,然后bs4呐什么的提取链接就ok。于是我天真地直接写下了这串开启我噩梦的代码:

import urllib.request as ur
from bs4 import BeautifulSoup
html = open(htmlname,'rb').read().decode('utf-8','ignore')
soup=BeautifulSoup(html,"lxml")
addr=[x["scr"] for x in soup.find_all("input")]
print(addr)

Ctrl+B,什么!!!无结果!!!我明明审查出了元素,怎么会没结果!!!
右键,查看源代码,Ctrl+F,依旧没有。
ok,百度一下,审查元素和源代码不同,得到了知乎的帮助
哈哈哈原来是python不支持js解析,不支持就不支持,先手工复制粘贴,以后再想办法解析js。这个坑先挖着:

爬虫采集-基于webkit核心的客户端Ghost.py

Python+Ghost抓取动态网页图片,并模拟页面Get请求

很坑的是ghost.py用法变了但是作者的官网还没有改。。在GitHub上找到了新的用法:

from ghost import Ghost
ghost = Ghost()
with ghost.start() as session:
    page, extra_resources = session.open("http://jeanphix.me")
    assert page.http_status == 200 and 'jeanphix' in page.content

一番尝试后依旧失败,先处理静态的吧╮(╯-╰)╭


爬虫大法好

爬虫一般是要走如下的道路的:

  • urllib模块获取网页源码
  • re模块或者bs4获取特定标签
  • 访问处理好的链接,获取文件,并保存

获取源码

右键审查元素,选中id=”Readweb”标签复制粘贴到一个空html文件,随意命名。

获取特定标签

打开html文件我们得到了一下的一大堆:

<div id="Readweb" style="height: 762px; overflow: auto;"><div class="duxiuimg" style="width: 700px; height: 1050px;"><div class="J_Msg" style="display: none;">正在加载.</div><input jpgname="cov001" scr="http://202.112.143.5:8182/png/png.dll?did=a174&amp;pid=64B227C9CDA6B0487BBEB39D54E17DE53A1EF251AEE5A15359DBD56F45688E209C96B3715B24A24B7663D00B39D0122273F0C76E6DFCE33F43C288F3965D298372FE85AF2664EB911BD60FDF6450D7F4FEF3D3F145032CD0556F83367A58014FF5E6E55DFAC19919FEA7C575C03D022BECC7&amp;jid=/cov001.jpg" src="images/none.gif" class="Jimg" readonly="" hidefocus="true" type="image" rotate="0" style="width: 700px; height: 1050px;"><div style="right: 5px; top: 5px; width: 65px; height: 20px; margin: 0px; position: absolute; z-index: 2; display: none;"><a style="margin-right: 5px;"><img title="刷新" src="images/update.gif"></a><a style="margin-right: 5px;"><img title="向左旋转90度" src="images/rotate1.gif"></a><a><img title="向右旋转90度" src="images/rotate.gif"></a></div></div><div class="duxiuimg" style="width: 700px; height: 1050px;"><div class="J_Msg" style="display: none;">正在加载.</div><input jpgname="cov002" scr="http://202.112.143.5:8182/png/png.dll?did=a174&amp;pid=64B227C9CDA6B0487BBEB39D54E17DE53A1EF251AEE5A15359DBD56F45688E209C96B3715B24A24B7663D00B39D0122273F0C76E6DFCE33F43C288F3965D298372FE85AF2664EB911BD60FDF6450D7F4FEF3D3F145032CD0556F83367A58014FF5E6E55DFAC19919FEA7C575C03D022BECC7&amp;jid=/cov002.jpg" src="images/none.gif" class="Jimg" readonly="" hidefocus="true" type="image" rotate="0" style="width: 700px; height: 1050px;">

仔细一看,我们要的就是那个<input jpgname="cov001" scr=...\> 里面的东西,所以用BeautifulSoup解析以后,直接选取所有imput标签里面的scr后面的链接就行。
以上两步代码如下:

def genimg(htmlname):
    #用二进制打开html文件,读取后用utf-8解码,选用‘ignore’模式防止出错
    html = open(htmlname,'rb').read().decode('utf-8','ignore')
    soup=BeautifulSoup(html,"lxml")
    addr=[x["scr"] for x in soup.find_all("input")]
    return addr

保存文件

得到图片的下载链接后,就可以遍历写入了。

htmlname=glob.glob('*.html')[0]
addr=genimg(htmlname)
os.mkdir('pics')
os.chdir('pics')
for i in range(len(addr)):
    with open(str(i)+'.jpg','wb') as f:
        f.write(ur.urlopen(addr[i]).read())
  • 首先在文件目录找到我们要处理的html,这里采用了glob模块,返回所有满足搜索的文件路径列表。
  • 用genimg函数得到图片链接addr。
  • 用os模块创建一个新文件夹pics,切换到pics目录。
  • 遍历addr,用urllib.request.urlopen打开图片链接,得到的是二进制字符串,正好直接写入文件,用open(文件名,’wb’)二进制写模式打开,写入。

python自带with语句,在with结束后自动会关闭文件f。如果不使用with,则需在写入完成后调用f.close()手动关闭。

Note:本来想在写入图片的时候采用多进程的,结果实验失败,心急吃不了热豆腐,还是要学习一下标准库之Multiprocessing

转换成pdf

经过以上的步骤我们就可以得到全部的图片了,剩下的事就是把jpg们变成pdf。很幸运,python有reportlab这个包,可以方便的处理pdf文件。

def getpdf():
    jpglist=sorted(glob.glob('*\\*.jpg'),key=(lambda x:int(x[5:-4])))
    c = canvas.Canvas('book.pdf') #创建pdf
    for fn in jpglist:
        dim=c.drawImage(fn,0,0)   #获取图片大小
        c.setPageSize(dim)        #设定pdf尺寸
        c.showPage()              #添加图片
    c.save()                      #保存文件
    print('ok')

首先找出所有的图片的路径,还是用glob模块,glob('*\\*.jpg')语句表示找出当前目录包括子目录下的jpg文件路径。
用sorted排序,key就和Mathematica里面的SortBy[]一样的用法,传入一个纯函数,作用到每个元素上,再sort。
把每个jpg添加到pdf文件后即可。

后记

这次爬虫留下了不少坑,列表如下,以后填:
1. python调用js ghost模块学习
2. python多进程并发 Mutiprocessing模块
3. glob模块学习
4. os模块深入学习
5. reportlab模块学习
应该为每一个深入学习的模块都写一篇博文才行。

全部代码

from bs4 import BeautifulSoup
import urllib.request as ur
from reportlab.pdfgen import canvas
import glob
import os
# 解析html
def genimg(htmlname):
    html = open(htmlname,'rb').read().decode('utf-8','ignore')
    soup=BeautifulSoup(html,"lxml")
    addr=[x["scr"] for x in soup.find_all("input")]
    return addr

#生成pdf
def getpdf():
    jpglist=sorted(glob.glob('*\\*.jpg'),key=(lambda x:int(x[5:-4])))
    c = canvas.Canvas('book.pdf')
    for fn in jpglist:
        dim=c.drawImage(fn,0,0)
        c.setPageSize(dim)
        c.showPage()
    c.save()
    print('ok')

htmlname=glob.glob('*.html')[0]
addr=genimg(htmlname)
os.mkdir('pics')
os.chdir('pics')
for i in range(len(addr)):
    with open(str(i)+'.jpg','wb') as f:
        f.write(ur.urlopen(addr[i]).read())
os.chdir('..')
getpdf()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值