前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谈一谈|以实践谈爬虫思路

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

作者头像
算法与编程之美
发布2020-04-20 13:11:53
5060
发布2020-04-20 13:11:53
举报
文章被收录于专栏:算法与编程之美

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.总结

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档