用python爬取网站数据期末作业_Python爬虫爬取博客园作业

news/2024/5/15 17:26:44/文章来源:https://blog.csdn.net/weixin_39683858/article/details/110317325

1482461-20181123193720753-604749194.png

分析一下他们的代码,我在浏览器中对应位置右键,然后点击检查元素,可以找到对应部分的代码。但是,直接查看当前网页的源码发现,里面并没有对应的代码。我猜测这里是根据服务器上的数据动态生成的这部分代码,所以我们需要找到数据文件,以便向服务器申请,得到这部分资源。

1482461-20181123193855382-1519754904.png

在刚才查看元素的地方接着找数据文件,在Network里面的文件中很顺利的就找到了,并在报文中拿到了URL和请求方法。

1482461-20181123194446248-1742174412.png

查看一下这个文件发现是JSON文件,那样的话难度就又降低了,因为Python中有json库,解析json的能力很强。可以直接将json转换为字典和列表类型。

1482461-20181123194618668-587640294.png

在这里我简单介绍一下数据解析的过程吧。首先,我将爬取到的json文本转换成某种数据类型,具体由数据决定,一般不是字典就是列表。查看类型发现是字典,且字典中有三个key值,而我们需要的key在一个叫data的key中。

1482461-20181128130154097-1349034909.png

而data中的数据是一个学生信息的列表类型,列表的每个元素都是一个字典,包括学生姓名,学号等信息。可以利用下标获取列表元素,并用key值得到你想拿到的信息。比如,利用Url得到网页链接。

1482461-20181128130702662-1653423861.png

1482461-20181128130740414-1474466488.png

这时候我们爬取需要的信息的准备工作可以说是结束了,我们拿到了数据的URL,并且知道了数据类型和数据结构。于是,我们只需要用requests库爬一下这个页面,然后用json解析一下,并且筛选有用的信息就好了。

(没用到BeautifulSoup和re库有点小失落)

接下来就是创建文件,就没有什么难度了。只是在为每个学生创建文件的时候注意一下,创建好以后及时的回到上层目录,否则,可能会让文件一层层的嵌套下去。

代码

#-*- coding:utf-8 -*-

importrequestsimportjsonimportos#抓取页面

url = 'https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=2420&_=1542959851766'

try:

r= requests.get(url,timeout=20)

r.raise_for_status()

r.encoding=r.apparent_encodingexcept:print('网络异常或页面未找到,请重试')#利用json拿到数据列表,每个列表元素都是字典

datas = json.loads(r.text)['data']

result= ""

#数据处理

for data indatas:

result+= str(data['StudentNo'])+','+data['RealName']+','+data['DateAdded'].replace('T',' ')+','+data['Title']+','+data['Url']+'\n'

#写入文件

with open('hwlist.csv','w') as f:

f.write(result)#创建文件夹hwFolder

os.mkdir('hwFolder')

os.chdir('hwFolder')#创建每个学生的作业文件

for data indatas:#创建目录

os.mkdir(str(data['StudentNo']))

os.chdir(str(data['StudentNo']))#抓取页面

try:

webmsg= requests.get(data['Url'],timeout=20)

webmsg.raise_for_status()

webmsg.encoding=webmsg.apparent_encodingexcept:print('网络异常或页面未找到,请重试')#保存抓到的页面

with open(str(data['StudentNo'])+'.html','wb') as f:

f.write(webmsg.content)

os.chdir(os.path.pardir)

部分结果展示

1482461-20181129152500948-1430817242.png

上图是hwlist.csv文件的部分结果(Excel下打开)

玩个稍复杂点的

像之前那样爬取页面的话,其实是有点问题的。首先,我们只是爬取了页面的内容,但是并没有抓取到页面的样式,页面显示会不太正常,排版混乱。其次,页面中还有图片等元素都不会显示出来。而且,如果遇到网络问题代码需要再次运行的时候还会遇到一个问题,那就是目录已经存在了,我们在创建目录就会失败。除此之外还是有不少问题的,此处我先解决之前说到的几个问题。即显示问题和目录问题。

如何解决我提到的这些问题呢,目录问题我使用了一种比较容易实现的方案,那就是先判断当前目录是否存在,如果不存在就创建目录,否则就什么都不做。至于文件,暂定的方法是直接覆盖。显示问题也比较好解决,抓取网页和抓取样式或者网页其实都一样,就是用URL发送一个请求,来获得这个资源,其实和抓取HTML相比,就是文件格式不太一致。

以抓取样式表(CSS)为例,样式的URL怎么获取呢?有一些样式是在一个叫做Link的标签的href属性里,这里面就是外联样式存储的位置。把它提取出来,请求这个样式,并且修改原来的href属性为抓到的文件在自己电脑上的保存位置即可。这样的话即可保证抓到的CSS可以正常使用,确保排版正确。

当然了,即使这样,和原本的网页也是有差别的,因为抓取到的资源还是不够,和浏览器中获得的元素对比一下就会发现还差不少。鉴于本人能力有限,这里就补充一下爬取外联CSS和图片的内容,感兴趣的可以看一看。

Tips:这里解析HTML页面借助了强大的BeautifulSoup4库(解析标签和玩一样)和re库,使工作量减少了不少。(安装bs4库: pip install BeautifulSoup4)

#-*- coding:utf-8 -*-

importrequestsimportjsonimportosimportrefrom bs4 importBeautifulSoupdef getHtml(url,timeout=110):try:

res=requests.get(url,timeout)

res.raise_for_status()

res.encoding=res.apparent_encodingreturnresexcept:print('网络异常,'+url+"爬取失败")def saveFile(name,content,mode='w'):try:

with open(name,mode) as f:

f.write(content)except:print("文件"+name+"创建失败")defgetSource(text):#抓取样式

root_url = 'https://www.cnblogs.com'soup= BeautifulSoup(text,'html.parser')for i in soup('link'):

css_list= [css for css in i['href'].split('/') if 'css' incss]if css_list!=[]:

filename= re.search(r'.*css',css_list[0]).group(0)

r= requests.get(root_url+i['href'])

saveFile(filename,r.content,'wb')

text= text.replace(i['href'],'Source/'+filename)#抓取图片 用户自己插入的图片和网站自己生成的图片都抓

#用户自己插的那些格式很乱……用户自己搞的东西就是个坑

for i in soup('img'):try:

img_list= [img for img in i['src'].split('/') if 'gif' in img or 'png' in img or 'jpeg' inimg]except KeyError :#某用户自己改了HTML代码 得让我单独判断一下

img_list =[]if img_list!=[]:

filename=img_list[0]try:

r= requests.get(root_url+i['src'])

r.raise_for_status()except:if not 'http' in i['src']:

r= requests.get("https:"+i['src'])else:#又是某用户写博客用了HTML编辑器,写的还不对

r = requests.get(i['src'])

saveFile(filename,r.content,'wb')

text= text.replace(i['src'],'Source/'+filename)#text用于修改原始的页面链接,保证本地可以正常查看页面

returntext#############################主程序#############################抓取页面 并得到数据

r = getHtml('https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=2420&_=1542959851766')

datas= json.loads(r.text)['data']#处理数据并将数据写入文件

result = ""

for data indatas:

result+= str(data['StudentNo'])+','+data['RealName']+','+data['DateAdded'].replace('T',' ')+','+data['Title']+','+data['Url']+'\n'saveFile('hwlist.csv',result,'w')#创建文件夹hwFolder

if not os.path.exists('hwFolder'):

os.mkdir('hwFolder')

os.chdir('hwFolder')#创建每个学生的作业文件

for data indatas:#创建目录

if not os.path.exists(str(data['StudentNo'])):

os.mkdir(str(data['StudentNo']))

os.chdir(str(data['StudentNo']))#抓取页面

webmsg = requests.get(data['Url'])print('当前的URL:'+data['Url'])#等待的过程有字出来不会无聊

#页面的一些资源

if not os.path.exists('Source'):

os.mkdir('Source')

os.chdir('Source')

webtext=getSource(webmsg.text)

os.chdir(os.path.pardir)

saveFile(str(data['StudentNo'])+'.html',webtext.encode(),'wb')

os.chdir(os.path.pardir)

如果你的网络没问题,讲道理,应该不会抛异常。接下来找个页面看看效果吧:

1482461-20181129155508165-543172965.png

1482461-20181129155522220-982735968.png

排版抓出来了,挺炫的,当然,图片也抓了。

1482461-20181129155608546-831053634.png

1482461-20181129155653195-1343825354.png

考虑到有人会HTML,我把被程序调整后的HTML代码找一个给大家看看,箭头指向的地方都是程序自己改过的地方:

1482461-20181129155850751-1660214651.png

其实,虽然现在又和原页面接近了不少,但是……我暂时没有时间继续完善了,以后还会继续完善。给大家一个原博客的图片,你会我先我还是少了些东西。暂时先这样吧。

1482461-20181129160119594-1163287688.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_783892.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

整理了一周的Python资料,包含各阶段所需网站、项目,收藏了慢慢来

这周应该有不少学校已经开学了,那么同学们都该动起来了,把家里面的那些懒习惯给扔掉了可以。 不知怎么的,最近不少关注我的读者都开始私信我怎么学好python?零基础转行是不是合适,还有希望吗?今年30了&…

linux浏览器老显示安全链接,Chrome浏览器显示“网站连接不安全”怎么解决?解决方法分享...

chrome浏览器是一个非常受欢迎的搜索服务软件,这款软件可以满足用户非常多搜索需求,有很多用户都会使用这款软件进行搜索,功能非常的全面,但是在使用Chrome浏览器的也会遇到一般浏览器都会遇到的问题,今天小编就会与大…

产品展示网站源码_ZBLOG免费网站导航主题 – 简单且支持内页详情目录模板

之前一段时间老蒋和从业网赚类网站的网友闲聊到看到有几个做网赚导航类型的网站盈利情况还是不错的,当然我不熟悉这个领域也没有打算做接触这个行业。不过我看到有不少网友在寻找类似的目录导航类网站源码,而且看到有些简单的源码居然还需要付费购买&…

毕业设计-证券宣传手机微网站的设计与实现

本文介绍基于.net的证券公司宣传微网站手机网页的设计与实现方法。 随着计算机技术的快速发展,基于Web的计算机网络金融、证券宣传或交易网站已成为现代金融理财发展的热点,B/S(Browser/Server)结构的互联网宣传也逐步在各大金融证券中得到了广泛的应用[1]。互联网金…

遗传算法matlab_史上最强的MATLAB自学网站,你收藏了吗???

各位小伙伴可点击此处,即可进入到优化算法交流地官方账号主页(推荐),谨防上当受骗。hello,大家好!这几天是全国大学生数学建模竞赛的比赛时间,首先预祝各位参赛的同学能够取得好成绩。今天&…

linux更换域名全站301,网站换域名必看,全站301重定向代码分享

网站换域名了,至于为什么要换不多说了,伤心事!犹豫了半年,新域名也早买好了,一直没下定决心要换域名,毕竟8年老站,中国不多说了,入题,想把域名换成 http://www.125jz.com…

织梦html标题怎么改,织梦网站seo优化技巧-改栏目名称seo标题即可

你们了解过织梦网站seo优化技巧吗?使用该优化首先你要改栏目名称为seo标题,然后在网站的UR路径上进行拼音的修改,修改完之后要以文章的路径保存好,感兴趣的话就随小编一起来了解下吧!第一步网站标题seo优化技巧:列表页标题优化技巧&#xff…

企业网站建设流程步骤,教你快速建网站

企业网站的重要性不言而喻,很多企业都想建一个企业网站,这样既能提高企业形象,还可以助力网络营销和品牌推广。那么如何参与到企业网站建设流程中呢?其实这个流程分五步,今天就为大家介绍一下。 第一步:确定…

模仿某网站招聘列表

引言 关注到一朋友所在公司的网站&#xff0c;看到招聘信息部分&#xff0c;突然觉的这个效果简单并且可复用&#xff0c;然后自己就练习了一把。 缺点 点击标题展开内容后&#xff0c;文字有点抖动&#xff0c;还没排查出来问题所在。 页面 1 <div classjobs_box>2 …

网狐网站后台发布与部署

发布成功并部署OK是这样子的 在部署前要先启用IIS功能 在控制面板的程序与功能左边可打开启用Windows功能窗口 IIS功能启用后可打开 IIS管理器,默认添加了Default Web Site

java 期刊,JSP/Java的期刊在线投稿系统|网站程序设计|程序源码

视频演示网址&#xff1a;http://www.bysjdq.com/project/show/CBADCFADD5E934B6.shtml?tff(咨询特价)系统功能模块设计1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对…

让你的IIS网站支持https协议

没加协议前,http访问 加上https协议支持后,通过https来访问 成功加了https访问协议后会看到红色箭头指向位置的443访问链接 在加https协议前要先已导入服务器证书

DotNetCore5.0 WebApi 发布IIS服务器后网站无法打开报404问题处理

解决方法: 在web.config中aspNetCore节点加入 <environmentVariables><environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" /></environmentVariables> 如下图所示 成功访问webapi网站 注意配置https访问

ubuntu18.04编译PHP8.0.9源码并安装PHP服务器及安装Nginx1.14.0服务器运行PHP网站

进入用户主目录 cd $HOME 下载PHP8.0.9源码 wget https://www.php.net/distributions/php-8.0.9.tar.gz 解压到/usr/local/src目录 sudo tar zxvf php-8.0.9.tar.gz -C /usr/local/src ls查看解压后文件

ubuntu 18.04配置Nginx 1.14.0服务器运行PHP8.0.9网站

配置OK后最终运行效果是这样的 在php8.0.9通过源码编译成功并安装后,安装nginx服务器然后配置, 在配置中添加index.php操作如下图 接着增加php文件解释与权限设置,操作如下图 注:nginx配置文件路径在:/etc/nginx/sites-enabled/default: default文件完整内容:

部署PHP网站到ubuntu系统的Nginx服务器

sudo apt install unzip 安装unzip用于解压zip文件 上传后布后的网站zip包到ubuntu 服务器, 并解压:sudo unzip xxx.zip 解压后移动要Nginx网站目录/var/www

mac安装nginx与配置php网站

修改了nginx和php-fpm的配置文件后要重启服务才生效 nginx -s reload可重新加载修改过的配置 brew services restart php可重启php服务 brew services restart nginx 可启动nginx服务 php --ini |grep Loaded 可查php.ini文件加载位置,位于/usr/local/etc/php/8.0/php.i…

百度自动推送收录HTML代码,百度和 360 网站自动推送代码阶段效果展示

前阵子魏艾斯博客更换了 sitemap 插件&#xff0c;又添加了 360 站长工具里面的自动推送代码&#xff0c;当时说过要等几天再去查看推送结果的&#xff0c;到现在也有快一个月了&#xff0c;那么百度站长工具和 360 站长平台自动推送代码安装使用后效果如何呢&#xff1f;为了起…

unix netcore 网站服务器,.net core Kestrel宿主服务器自定义监听端口配置

在.net core的web程序中&#xff0c;除了可以在项目中硬编码服务器的监听端口外&#xff0c;还可以在外部通过json文件配置。方法如下&#xff1a;第一步&#xff1a;在项目中新建一个名为Hosting.json的文件。当然&#xff0c;文件名可以随便取。然后在其中添加如下内容&#…

hyper爬虫https2.0协议网站,使用py2exe无法打包certs.pem解决办法

最近使用hyper爬取https2.0协议网站的数据时&#xff0c;最后使用py2exe打包成exe后&#xff0c;发现证书certs.pem没有被打包进去。 前期一直在想办法使用py2exe将certs.pem打包进exe中&#xff0c;网上很多方法是直接将certs.pem复制进exe里面&#xff0c;但实际工作是根本行…