批量抓取网页pdf文件
时间:2023-04-02 13:53:28
HTML
任务:批量抓取网页pdf文件有个excel,里面有几千个网页地址指向pdf下载链接。现在,需要批量抓取这些网页地址中的pdf文件。python环境:anaconda3openpyxlbeautifulsoup4读取excel,获取网页地址使用openpyxl库,读取.xslx文件;(我尝试使用xlrd库读取.xsl文件,但无法获取超链接)installopenpyxlpipinstallopenpyxltoextracthyperlinkinxslxfileExamplefileconstructionAnnouncementDateSecuritiesCodeAnnouncementTitle2018-04-20603999.SH读者媒体:2017年报2018-04-28603998.SH方生药业:2017年年报defreadxlsx(path):workbook=openpyxl.load_workbook(path)Data_sheet=workbook.get_sheet_by_name('sheet1')rowNum=Data_sheet.max_row#读取最大条数rowsc=3#第三列是要提取的数据server='http://news.windin.com/ns/'forrowinrange(1,rowNum+1):link=Data_sheet.cell(row=row,column=c).valueurl=re.split(r'\"',link)[1]print(url)downEachPdf(url,server)获取网页pdf下载地址,进入ReaderMedia:2017Annual举报,在chrome浏览器中,可以按F12查看网页源码,下面截取部分源码:附件:
603999ReaderMedia2017AnnualReport.pdf(2.00M)  可以看到在a标签中有herf下载链接,通过解析html源码可以得到下载链接。在这里,BeautifulSoup用于解析html。BeautifulSoup是一个用Python编写的HTML/XML解析器,可以很好地处理不规则标签并生成解析树。它为导航、搜索和修改分析树提供了简单和通用的操作。它可以大大节省您的编程时间。安装BeautifulSoup4pipinstallbeautifulsoup4获取pdf下载链接并下载defdownEachPdf(target,server):req=requests.get(url=target)html=req.textbf=BeautifulSoup(html,features="lxml")a=bf.find_all('a')foreachina:url=server+each.get('href')print("downloading:",each.string,url)urllib.request.urlretrieve(url,'./report/'+each.string)同一个ip重复访问同一个服务器被拒绝使用上面的方法,可以实现批量网页pdf下载。但是在实际操作过程中会发现,如果同一个ip频繁访问某台服务器,访问会被拒绝(可能会被误判为DOS攻击,通常有rate-limit的网站会停止响应一段时间。可以catch这个Exception然后sleep一段时间,参考)。因此,对下载逻辑进行了调整。使用try-catch,具体逻辑是:正常情况下,按顺序下载文件。如果同一个文件下载失败超过10次,则跳过它,下载下一个文件,并记录错误信息。importosimporttimedefdownloadXml(flag_exists,file_dir,file_name,xml_url):如果不存在flag_exists:os.makedirs(file_dir)local=os.path.join(file_dir,file_name)try:urllib.request.urlretrieve(xml_url,local)除了异常作为e:print('第一个错误:',e)cur_try=0total_try=10ifcur_try