最近,孩子上课都没有课本,老师给发的是一个微信链接,打开看可以,打印打不全。怎么办?我就想既然能看,从爬虫的角度就一定可以抓下来!
在Chrome中打开网址,好家伙!一堆的Script之类的玩意儿。经过一番查找,发现他所有的图片都在一个div中。然后, 所有的图片的url都在里边。
格式大致像下面这个样子:
https://xxx.xxx.xxx/xxxx_jpg/Yf5NpblQ4YialfPteJjMWGJtpCIGzyXuKd4zEFbAZ8eKAy9sHHFZWfaZK3mQh1XL0rdlLRdcflgxQY9ibK9BcAxw/640?wx_fmt=jpeg
避免一些不必要的麻烦,网址我隐去了。顺便说明:咱就是为了学习,没别的。
虽然,我知道Xpath,BS4可以解决,可我还没有详细研究,所以,就用正则好了。上代码:
import requests import re def write_jpg(img_url, filename): img_data = requests.get(url=img_url, headers=headers).content with open('./eng/' + filename + '.jpg', 'wb') as fp: fp.write(img_data) #这个网址好长好长,省略 url = 'https://mp.weixin.qq.com/...................' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' } #这一块先把那个div整下来 response = requests.get(url=url, headers=headers).text str_re1 = '<div class="rich_media_content " id="js_content" style="visibility: hidden;">(.*?)</div>' pat1 = re.compile(str_re1, re.S) items = re.findall(pat1, response) #再把所有的图片URL抓下来,存入Items2中 str_re2 = 'https://.*?jpeg' pat2 = re.compile(str_re2, re.S) items2 = re.findall(pat2, items[0]) #然后,把每一张图片下载下来,存入eng目录中 for i in range(0, len(items2)): write_jpg(items2[i], str(i)) print("the %d page downloads successful!" % i)
不一会,几十张图片下载完毕,本来想一次存入Word中,打印文档。后来想,还不如生成一个PDF。轮子肯定有人造好了。百度!果然有个img2pdf库已经为我准备好了。
还是上代码吧!
import img2pdf import os def gen_file_list(dir_s): f_list = os.listdir(dir_s) for i in range(0, len(f_list)): f_list[i] = dir_s + '/' + f_list[i] return f_list sourc_dir = './eng' # print(gen_file_list(sourc_dir)) a4input = (img2pdf.mm_to_pt(210), img2pdf.mm_to_pt(297)) layout_fun = img2pdf.get_layout_fun(a4input) with open('english6x.pdf', 'wb') as f: f.write(img2pdf.convert(gen_file_list(sourc_dir), layout_fun=layout_fun))
代码不复杂,我就不解释了。之所以把这个东西发上来,主要是感觉学东西,还是从实用角度比较快,也比较容易有成就感!