⽤python爬取⽹站数据期末作业_Python爬⾍爬取博客园作业grep不区分大小写
分析⼀下他们的代码,我在浏览器中对应位置右键,然后点击检查元素,可以到对应部分的代码。但是,直接查看当前⽹页的源码发现,⾥⾯并没有对应的代码。我猜测这⾥是根据服务器上的数据动态⽣成的这部分代码,所以我们需要到数据⽂件,以便向服务器申请,得到这部分资源。
在刚才查看元素的地⽅接着数据⽂件,在Network⾥⾯的⽂件中很顺利的就到了,并在报⽂中拿到了URL和请求⽅法。
查看⼀下这个⽂件发现是JSON⽂件,那样的话难度就⼜降低了,因为Python中有json库,解析json的能⼒很强。可以直接将json转换为字典和列表类型。
在这⾥我简单介绍⼀下数据解析的过程吧。⾸先,我将爬取到的json⽂本转换成某种数据类型,具体由数据决定,⼀般不是字典就是列表。查看类型发现是字典,且字典中有三个key值,⽽我们需要的ke
y在⼀个叫data的key中。
⽽data中的数据是⼀个学⽣信息的列表类型,列表的每个元素都是⼀个字典,包括学⽣姓名,学号等信息。可以利⽤下标获取列表元素,并⽤key值得到你想拿到的信息。⽐如,利⽤Url得到⽹页链接。
这时候我们爬取需要的信息的准备⼯作可以说是结束了,我们拿到了数据的URL,并且知道了数据类型和数据结构。于是,我们只需要⽤requests库爬⼀下这个页⾯,然后⽤json解析⼀下,并且筛选有⽤的信息就好了。
(没⽤到BeautifulSoup和re库有点⼩失落)
接下来就是创建⽂件,就没有什么难度了。只是在为每个学⽣创建⽂件的时候注意⼀下,创建好以后及时的回到上层⽬录,否则,可能会让⽂件⼀层层的嵌套下去。
代码
#-*- coding:utf-8 -*-
importrequestsimportjsonimportos#抓取页⾯
url = 'edublogs/Homework/GetAnswers?homeworkId=2420&_=1542959851766'
try:
r= (url,timeout=20)
r.raise_for_status()
datas = json.)['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= (data['Url'],timeout=20)
webmsg.raise_for_status()
with open(str(data['StudentNo'])+'.html','wb') as f:
f.write(webms
os.chdir(os.path.pardir)
部分结果展⽰
上图是hwlist.csv⽂件的部分结果(Excel下打开)
玩个稍复杂点的
像之前那样爬取页⾯的话,其实是有点问题的。⾸先,我们只是爬取了页⾯的内容,但是并没有抓取到页⾯的样式,页⾯显⽰会不太正常,排版混乱。其次,页⾯中还有图⽚等元素都不会显⽰出来。⽽且,如果遇到⽹络问题代码需要再次运⾏的时候还会遇到⼀个问题,那就是⽬录已经存在了,我们在创建⽬录就会失败。除此之外还是有不少问题的,此处我先解决之前说到的⼏个问题。即显⽰问题和⽬录问题。
如何解决我提到的这些问题呢,⽬录问题我使⽤了⼀种⽐较容易实现的⽅案,那就是先判断当前⽬录是否存在,如果不存在就创建⽬录,否则就什么都不做。⾄于⽂件,暂定的⽅法是直接覆盖。显⽰问题也⽐较好解决,抓取⽹页和抓取样式或者⽹页其实都⼀样,就是⽤URL发送⼀个请求,来获得这个资源,其实和抓取HTML相⽐,就是⽂件格式不太⼀致。
以抓取样式表(CSS)为例,样式的URL怎么获取呢?有⼀些样式是在⼀个叫做Link的标签的href属性⾥,这⾥⾯就是外联样式存储的位置。把它提取出来,请求这个样式,并且修改原来的href属性为抓到的⽂件在⾃⼰电脑上的保存位置即可。这样的话即可保证抓到的CSS可以正常使⽤,确保排版正确。
当然了,即使这样,和原本的⽹页也是有差别的,因为抓取到的资源还是不够,和浏览器中获得的元素对⽐⼀下就会发现还差不少。鉴于本⼈能⼒有限,这⾥就补充⼀下爬取外联CSS和图⽚的内容,感兴趣的可以看⼀看。
Tips:这⾥解析HTML页⾯借助了强⼤的BeautifulSoup4库(解析标签和玩⼀样)和re库,使⼯作量减少了不少。(安s4库: pip install BeautifulSoup4)
#-*- coding:utf-8 -*-
importrequestsimportjsonimportosimportrefrom bs4 importBeautifulSoupdef getHtml(url,timeout=110):try:
(url,timeout)
python请求并解析json数据res.raise_for_status()
saveFile(name,content,mode='w'):try:
with open(name,mode) as f:
f.write(content)except:print("⽂件"+name+"创建失败")defgetSource(text):#抓取样式
root_url = 'wwwblogs'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= (root_url+i['href'])
saveFile(t,'wb')
fontcreator修改字体属性text= place(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= (root_url+i['src'])
r.raise_for_status()except:if not 'http' in i['src']:
web前端开发工程师的介绍
r= ("https:"+i['src'])else:#⼜是某⽤户写博客⽤了HTML编辑器,写的还不对
r = (i['src'])
saveFile(t,'wb')
text= place(i['src'],'Source/'+filename)#text⽤于修改原始的页⾯链接,保证本地可以正常查看页⾯
returntext>>>>>####主程序>>>>>####抓取页⾯ 并得到数据
r = getHtml('edublogs/Homework/GetAnswers?homeworkId=2420&_=1542959851766')
datas= json.)['data']#处理数据并将数据写⼊⽂件
result = ""
for data indatas:
result+= str(data['StudentNo'])+','+data['RealName']+','+data['DateAdded'].replace('T','
smart意思汽车
')+','+data['Title']+','+data['Url']+'\n'saveFile('hwlist.csv',result,'w')#创建⽂件夹hwFolder
if not ists('hwFolder'):
range是什么意思啊
os.mkdir('hwFolder')
os.chdir('hwFolder')#创建每个学⽣的作业⽂件
for data indatas:#创建⽬录
if not ists(str(data['StudentNo'])):
os.mkdir(str(data['StudentNo']))
os.chdir(str(data['StudentNo']))#抓取页⾯
webmsg = (data['Url'])print('当前的URL:'+data['Url'])#等待的过程有字出来不会⽆聊
#页⾯的⼀些资源
if not ists('Source'):
os.mkdir('Source')
os.chdir('Source')
webtext=)
os.chdir(os.path.pardir)
saveFile(str(data['StudentNo'])+'.html',de(),'wb')
os.chdir(os.path.pardir)
如果你的⽹络没问题,讲道理,应该不会抛异常。接下来个页⾯看看效果吧:
排版抓出来了,挺炫的,当然,图⽚也抓了。
考虑到有⼈会HTML,我把被程序调整后的HTML代码⼀个给⼤家看看,箭头指向的地⽅都是程序⾃⼰改过的地⽅:

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

发表评论