抓取网页生成电子书(603999.SH读者传媒:2017年年度报告获取网页pdf下载地址 )

优采云 发布时间: 2022-02-17 08:18

  抓取网页生成电子书(603999.SH读者传媒:2017年年度报告获取网页pdf下载地址

)

  任务:批量抓取网页pdf文件

  有一个收录数千个指向 pdf 下载链接的网页地址的 excel。现在,需要批量抓取这些网页地址中的pdf文件。

  蟒蛇环境:

  蟒蛇3

  打开pyxl

  beautifulsoup4读取excel并获取网页地址

  使用 openpyxl 库读取 .xslx 文件;

  (尝试使用 xlrd 库读取 .xsl 文件,但无法获取超链接)

  安装 openpyxl

  pip install openpyxl

  提取 xslx 文件中的超链接

  示例文件构建

  公告日期 证券代码 公告标题

  2018-04-20

  603999.SH

  读者媒体:2017年年报

  2018-04-28

  603998.SH

  方生药业:2017年年报

  def readxlsx(path):

workbook = openpyxl.load_workbook(path)

Data_sheet = workbook.get_sheet_by_name('sheet1')

rowNum = Data_sheet.max_row #读取最大行数

c = 3 # 第三列是所需要提取的数据

server = 'http://news.windin.com/ns/'

for row in range(1, rowNum + 1):

link = Data_sheet.cell(row=row, column=c).value

url = re.split(r'\"', link)[1]

print(url)

downEachPdf(url, server)

  获取网页的pdf下载地址

  进入读者传媒:2017年报,可以在chrome浏览器中按F12查看网页源代码,以下截取部分源代码:

  附件: <a href=[getatt.php?id=91785868&att_id=32276645](http://news.windin.com/ns/getatt.php?id=91785868&att_id=32276645) class=&#39;big&#39; title=603999读者传媒2017年年度报告.pdf>603999读者传媒2017年年度报告.pdf </a>&nbsp;&nbsp; (2.00M) &nbsp;&nbsp

  可以看出herf下载链接在a标签中,通过解析html源码可以得到下载链接。

  这里使用 BeautifulSoup 来解析 html。

  Beautiful Soup 是一个用 Python 编写的 HTML/XML 解析器,可以很好地处理非标准标记并生成解析树。它提供了用于导航、搜索和修改解析树的简单而常用的操作。它可以大大节省您的编程时间。安装 BeautifulSoup4

  pip install beautifulsoup4

  获取pdf下载链接并下载

  def downEachPdf(target, server):

req = requests.get(url=target)

html = req.text

bf = BeautifulSoup(html, features="lxml")

a = bf.find_all(&#39;a&#39;)

for each in a:

url = server + each.get(&#39;href&#39;)

print("downloading:", each.string, url)

urllib.request.urlretrieve(url, &#39;./report/&#39; + each.string)

  同一ip重复访问同一台服务器被拒绝

  以上方法已用于网页批量下载pdf。但是在实际操作过程中会发现,如果同一个ip频繁访问某台服务器,访问会被拒绝(可能误判为DOS攻击,通常做Rate -limit 网站会停止响应一段时间,可以Catch这个Exception并休眠一段时间,供参考)。因此,下载逻辑进行了调整。

  使用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:

urllib.request.urlretrieve(xml_url, local)

except Exception as e:

print(&#39;the first error: &#39;, 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(&#39;the last error: &#39;)

with open(test_dir + &#39;error_url.txt&#39;, &#39;a&#39;) as f:

f.write(xml_url)

raise Exception(e)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线