专栏首页算法与编程之美谈一谈|以实践谈爬虫思路

谈一谈|以实践谈爬虫思路

1.开篇

本文旨在给python初学者在进行爬虫时进行一些启发,主要是给出爬虫的基本思路,然后介绍这个第一次成果。

2.爬虫介绍

简单的爬虫主要分为四部分:了解网页、获取网页数据、解析网页、清洗数据。首先需要了解几个库:requests,beautifulsoup,urllib等。这些都是接触爬虫必须用到的库,不必再过多介绍。下面就通过四个部分来完成一次简单爬虫。

3.步骤解析

本次任务是从:

http://www.chinacdio.stu.edu.cn/List_Extend.aspx?id=101&CurrentPage=0所有页面上的pdf文件下载下来,并且pdf文件名和网页上的文件名一致。

首先分析该网页:

图3.1 第一页

图3.2 第二页

可以发现网址最后“page=“后的数字可以代表页数,既然如此,那么就可以通过一个for循环将四个数字填充到“page=”后以来获取这四页的信息。目录页分析完就该分析每一项的网页:

图3.3 第一项内容

图3.4 第二项内容

这里笔者只点进了两页,可以看到网址中除了id进行变化其他均未变,只要细心去找,其他所有页面皆如此,那么我们的下一步就是从目录页中找到每一个子网页的id。

图3.5 解析目录获得子网页id

运用谷歌浏览器开发者功能,很容易能找到其id,通过beautifulsoup解析获取的目录页,根据每个id前的标签截取id储存在list中。有了独特的id,就可以自动从list中获取id填充至固有网址,达到自动分别解析所有子页面。然后再看单个pdf:

图3.6 pdf1

图3.7 pdf2

相信规律很容易被发现,和获取id的方式一样,运用谷歌开发者功能,利用标签,从子网页中找到每个pdf的名字,也就是每个pdf网址中不同的部分,并保存至一个list。

接下来就是最后一步,前面的操作无非是使用了几个for循环将改网页下所有页面的pdf名称也就是最后获取pdf网址中不同部分保存了起来。只需要最后一个for循环将这些带入到不变的部分中,就可以获取每个pdf网址内容,因为每个pdf网页中无其它内容,只需要将所有数据保存,写入一个.pdf文件中就完成了。Pdf的名称也可以从最后一个list中获取。

Python代码:

import requestsfrom bs4 import BeautifulSoupfrom urllib import parsefor page in range(0,4): html=requests.get("http://www.chinacdio.stu.edu.cn/List_Extend.aspx?id=101&CurrentPage=%d"%page) html = html.text soup = BeautifulSoup(html,"lxml") Id_list = [] for item in soup.find_all(class_="main"): for link in item.find_all("li"): for i in link.find_all("a"): pdf_link = i["href"] Id = "".join([x for x in pdf_link if 48<=ord(x)<=57][:-3]) Id_list.append(int(Id)) pdf_dict = {} pdf_names = [] for i in Id_list: page_html=requests.get("http://www.chinacdio.stu.edu.cn/Detail_Code.aspx?Content_ID=%d&Channel_ID=101"%i) page_html = page_html.text page_soup = BeautifulSoup(page_html,"lxml") for item in page_soup.find_all(class_="main"): for item2 in item.find_all("a"): pdf_name = item2["href"] if pdf_name[0:7] == "/Upload" and pdf_name[-4:] == ".pdf": pdf_dict[pdf_name] = item2.text pdf_names.append(pdf_name) for name in pdf_names: if name[-4:] == ".pdf": name = name[7:] name1 = parse.quote(name) pdf_html=requests.get("http://www.chinacdio.stu.edu.cn/upload/%s"%name1) pdf_html.encoding = pdf_html.apparent_encoding # print(pdf_html) with open('%s'%name, 'wb') as f: f.write(pdf_html.content) print("%s 下载完成!"%name) print() else: continue for name in pdf_dict.keys(): if name[-4:] == ".pdf": names = name[8:] pdf_html=requests.get("http://www.chinacdio.stu.edu.cn/Upload/%s" % names) pdf_html.encoding = pdf_html.apparent_encoding # print(pdf_html) with open('%s' % pdf_dict[name], 'wb') as f: f.write(pdf_html.content) print("%s 下载完成!" % pdf_dict[name]) print() else: continue

4.总结

因本网页存在一些特殊问题,所以还需要具体分析才能得到笔者的代码。当然如果你们已经看明白了解说部分,那么多余的代码自然能够看懂。

笔者这里只是想通过一次自己的实践来给爬虫初学者一个思路,希望能帮助到你们。并且这里只是一些简单的爬虫,更加深层次还需要大家去探索。

本文分享自微信公众号 - 算法与编程之美(algo_coding),作者:李和龙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微信小程序|抽奖大转盘实战

    在抽奖的应用或小程序中,大多会采用一种常见的大转盘抽奖方式,这种方式能直观展现出这个抽奖活动的形式和内容,且能直接吸引人参与。那么这个功能是如何实现的呢?

    算法与编程之美
  • 微信小程序|突出优点

    为了避免用户在微信中使用小程序服务时,注意力被周围复杂环境干扰,小程序在设计时应该注意减少无关的设计元素对用户目标的干扰,礼貌地向用户展示程序提供的服务,友好地...

    算法与编程之美
  • 开发|我对agile的初识

    随着对专业知识的更加了解,我对于自身的发展方向也更加明确。合理配置相应的资源,积极调动人力,高效的完成项目,应用好PM方法论,向着一个具有先导判断力和明锐决策力...

    算法与编程之美
  • 126篇殿堂级深度学习论文分类整理 从入门到应用(上)

    █ 如果你有非常大的决心从事深度学习,又不想在这一行打酱油,那么研读大牛论文将是不可避免的一步。而作为新人,你的第一个问题或许是:“论文那么多,从哪一篇读起?”...

    AI研习社
  • 资料 | 机器学习入门书单及下载

    关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 获取方式:后台回复 “入门书单” M...

    昱良
  • 如何用Python批量提取PDF文本内容?

    本文为你展示,如何用Python把许多PDF文件的文本内容批量提取出来,并且整理存储到数据框中,以便于后续的数据分析。

    王树义
  • 用Python处理PDF

    PDF作为可移植文档格式(Portable Document Format),在日常生活中经常接触到,最近处理一些数据更是频繁接触一些需要批量处理pdf文件的需...

    蛰虫始航
  • 云加社区技术沙龙资料合集

    云加社区技术沙龙
  • 使用TCPDF撰写和生成PDF文件

    某一个合同需要在线生成,其中一部分内容是固定的,而另一部分内容是需要添加和编辑的。

    双面人
  • Lidar Point clound processing for Autonomous Driving

    A list of references on lidar point cloud processing for autonomous driving

    点云PCL博主

扫码关注云+社区

领取腾讯云代金券