批量抓取⽹页pdf⽂件
任务:批量抓取⽹页pdf⽂件
有⼀个excel,⾥⾯有数千条指向pdf下载链接的⽹页地址,现在,需要批量抓取这些⽹页地址中的pdf⽂件。
python环境:
anaconda3
openpyxl
beautifulsoup4
读取excel,获取⽹页地址
使⽤openpyxl库,读取.xslx⽂件;
(曾尝试使⽤xlrd库读取.xsl⽂件,但⽆法获取超链接)
1. 安装openpyxl
pip install openpyxl
2. 提取xslx⽂件中的超链接
⽰例⽂件构造
公告⽇期证券代码公告标题
2018-04-20603999.SH
2018-04-28603998.SH
def  readxlsx(path):
workbook = openpyxl.load_workbook(path)
Data_sheet = _sheet_by_name('sheet1')
rowNum = Data_sheet.max_row #读取最⼤⾏数
c =  3  # 第三列是所需要提取的数据
server =  'news.windin/ns/'
for  row  in  range(1, rowNum  +  1):
link = ll(row=row, column=c).value
url = re.split(r'\"', link)[1]
print(url)
downEachPdf(url, server)
获取⽹页pdf下载地址
进⼊,在chrome浏览器中可以按F12查看⽹页源码,以下截取部分源码:
<div class="box4"><div style='float:left;width:40px;background-color:#ffffff;'>附件:</div>  <div style=float:left;width:660px;background-color:#f3f3f3;'>  <a href=[geta
可见,herf下载链接在a标签中,可以通过解析html源码获取下载链接。
这⾥使⽤BeautifulSoup解析html。
Beautiful Soup 是⽤Python写的⼀个HTML/XML的解析器,它可以很好的处理不规范标记并⽣成剖析树(parse tree)。 它提供简
单⼜常⽤的导航(navigating),搜索以及修改剖析树的操作。它可以⼤⼤节省你的编程时间。
1. 安装BeautifulSoup4
pip install beautifulsoup4
1. 获取pdf下载链接并下载
def  downEachPdf(target, server):
req = (url=target)
html =
bf = BeautifulSoup(html, features="lxml")
网页html下载a = bf.find_all('a')
for each in a:
url = server + ('href')
print("downloading:", each.string, url)
同⼀ip重复访问同⼀服务器被拒绝
利⽤以上⽅法已经能够实现批量⽹页pdf的下载了,但是,在实际操作过程中,会发现如果同⼀ip频繁地访问某⼀服务器,访问会被拒绝(可能被误判为DOS攻击,通常做了Rate-limit的⽹站都会停⽌响应⼀段时间,你可以Catch这个Exception,sleep⼀段时间,)。因此,对下载逻辑进⾏了调整。
利⽤try-catch,具体逻辑是:正常情况下,按次序下载⽂件,如果同⼀⽂件,下载失败次数超过10,则跳过,下载下⼀个⽂件,并记录错误信息。
import os
import time
def  downloadXml(flag_exists, file_dir, file_name, xml_url):
if  not flag_exists:
os.makedirs(file_dir)
local = os.path.join(file_dir, file_name)
try:
except  Exception  as e:
print('the first error: ', e)
cur_try =  0
total_try =  10
if cur_try < total_try:
cur_try +=  1
time.sleep(15)
return downloadXml(flag_exists, file_dir, file_name, xml_url)
else:
print('the last error: ')
with  open(test_dir +  '', 'a') as f:
f.write(xml_url)
raise  Exception(e)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。