摘要:爬虫下载二最近在学习的爬虫,并且玩的不亦说乎,因此写个博客,记录并分享一下。需下载下载以下模块模块模块一源码设置命令行参数功能下载目标最大的线程数。方法的作用与内置函数类似,不过函数会在多个线程中并发调用方法返回一个生成器。
Python3爬虫下载pdf(二)
最近在学习python的爬虫,并且玩的不亦说乎,因此写个博客,记录并分享一下。
需下载下载以下模块
bs4模块
requests模块
一、源码from concurrent.futures import ThreadPoolExecutor import requests,argparse,re,os from bs4 import BeautifulSoup as Soup headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0" } ## 设置命令行参数 def setArgs(): parser = argparse.ArgumentParser(description="功能:下载pdf") parser.add_argument("url",help="目标url") parser.add_argument("-t","--thread",help="最大的线程数。默认为3",default=3,type=int) parser.add_argument("-f","--filedir",help="文件保存的路径.默认为当前目录下的downloads文件夹.如果不存在,便自动新建",default="downloads") return parser.parse_args() ## 获取所有pdf的url def getPdfUrl(root_url): response = requests.get(root_url, headers=headers) ## 如果requests没有从页面中获得字符编码,那么设置为utf-8 if "charset" not in response.headers: response.encoding = "utf-8" bsObj = Soup(response.text, "html.parser") pdfs = bsObj.find_all("a", {"href": re.compile(r".pdf$")}) ## 获得一个字典,key为pdf完整url,value为pdf名称 url_pdfName = {root_url[:root_url.rfind("/")+1]+pdf["href"]:pdf.string for pdf in pdfs} return url_pdfName ## 显示正在下载的pdf的名称 def showPdf(pdf_name): print(pdf_name+"...") ## 下载pdf def savePdf(url,pdf_name): response = requests.get(url,headers=headers,stream=True) ## 如果指定的文件夹,那么便新建 if not os.path.exists(FILE_DIR): os.makedirs(FILE_DIR) ## os.path.join(a,b..)如果a字符串没有以/结尾,那么自动加上。(windows下) with open(os.path.join(FILE_DIR,pdf_name),"wb") as pdf_file: for content in response.iter_content(): pdf_file.write(content) ## 设置要下载一个pdf要做的事情,作为线程的基本 def downOne(url,pdf_name): showPdf(pdf_name) savePdf(url,pdf_name) print(pdf_name+" has been downloaded!!") ## 开始线程 def downPdf(root_url,max_thread): url_pdfName = getPdfUrl(root_url) with ThreadPoolExecutor(max_thread) as executor: executor.map(downOne,url_pdfName.keys(),url_pdfName.values()) def main(): ## 获得参数 args = setArgs() ## 如果没有输入必须的参数,便结束,返回简略帮助 try: global FILE_DIR FILE_DIR = args.filedir downPdf(args.url,args.thread) except: exit() if __name__ == "__main__": main()效果图
例子:
with ThreadPoolExecutor(max_thread) as executor: executor.map(downOne,url_pdfName.keys(),url_pdfName.values())
使用工作的线程实例化ThreadPoolExecutor 类;executor._exit_ 方法会调用executor.shutdown(wait=True) 方法,它会在所有线程都执行完毕前阻塞线程。
map方法的作用与内置map函数类似,不过downOne函数会在多个线程中并发调用;map方法返回一个生成器。
global FILE_DIR FILE_DIR = args.filedir
设置了全局参数,用来接收文件路径的值
因为后面用executor.map() 传参的时候,参数必须是iterabe,不知道咋放了,所以就设了个全局变量
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/40762.html
摘要:爬虫下载一最近在学习的爬虫,并且玩的不亦说乎,因此写个博客,记录并分享一下。 Python3爬虫下载pdf(一) 最近在学习python的爬虫,并且玩的不亦说乎,因此写个博客,记录并分享一下。 需下载以下模块 bs4 模块 requests 模块 一、源码 功能:下载指定url内的所有的pdf 语法:将含有pdf的url放到脚本后面执行就可以了 from bs4 import...
摘要:在这之前,还是有必要对一些概念超轻量级反爬虫方案后端掘金前言爬虫和反爬虫日益成为每家公司的标配系统。 爬虫修炼之道——从网页中提取结构化数据并保存(以爬取糗百文本板块所有糗事为例) - 后端 - 掘金欢迎大家关注我的专题:爬虫修炼之道 上篇 爬虫修炼之道——编写一个爬取多页面的网络爬虫主要讲解了如何使用python编写一个可以下载多页面的爬虫,如何将相对URL转为绝对URL,如何限速,...
摘要:今天介绍一种通过抓包端微信的方式去获取公众号文章的方法。如上图,通过抓包工具获取微信的网络信息请求,我们发现每次下拉刷新文章的时候都会请求这个接口。 本文首发自公众号:python3xxx 爬取公众号的方式常见的有两种 通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章 通过微信公众号的素材管理,获取公众号文章。缺点是需要申请自己的公众号。 showImg(//img.mukew...
摘要:,简称为,是一种脚本语言,和配合使用,提供给用户的只是一种静态的信息,缺少交互性。这就是网页的三大基本组成。父节点拥有子节点,同级的子节点被称为兄弟节点。选择属于其父节点的首个节点的每个节点。同上,从最后一个 上一篇文章:Python3网络爬虫实战---15、爬虫基础:HTTP基本原理下一篇文章:Python3网络爬虫实战---17、爬虫基本原理 我们平时用浏览器访问网站的时候,一个...
摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...
阅读 2582·2021-11-22 15:25
阅读 1377·2021-11-15 17:59
阅读 1100·2021-09-29 09:34
阅读 1478·2021-09-26 09:46
阅读 3003·2021-09-02 15:40
阅读 1144·2019-08-30 15:56
阅读 3228·2019-08-30 15:55
阅读 666·2019-08-29 17:08