最近业余在做一个基于.NET Core的搜索项目,奈何基层代码写好了,没有看起来很华丽的数据供测试。很巧的也是博客搜索,于是乎想到了博客园。C#也能做做页面数据抓取的,不过在博客园看到的大部分都是python实现,所以就临时想了一下看看python到底是什么东东,不看基础语法,不看语言功能,直接上代码,哪里不会搜哪里。代码完成总共用时大概4个小时,其中搭建环境加安装BeautifulSoup大概1个小时。解析HTML用时间最多了,边看demo边解析,大概2个小时,剩下的时间就是调试加保存数据了。

环境搭建

  既然用python,那么自然少不了语言环境。于是乎到官网下载了3.5版本的。安装完之后,随机选择了一个编辑器叫PyCharm,话说python编辑器还真挺多的。由于本人是小白,所以安装事项不在过多赘述。

  

  建好项目,打开编辑器,直接开工。本来之前用C#写的时候,大体思路就是获取网页内容,然后正则匹配。后来发现网上的帖子也很多。不过在搜索过程中发现,不建议用正则来匹配HTML。有正好我的正则不太好,所以我就搜了一下HTML解析工具,果不其然,人家都做好了,直接拿来用吧。没错就是这个东东:BeautifulSoup 。安装也很简单,不过中间出了个小插曲,就是bs4没有。继续搜,然后需要用pip安装一下就好了。(当然我并不知道ps4和pip是什么鬼)

  

思路分析

  博客吗,我当然就对准了博客园,于是乎,进入博客园首页,查看请求。

  

发送请求

  当然我不知道python是怎么进行网络请求的,其中还有什么2.0和3.0的不同,中间曲曲折折了不少,最终还是写出了最简单的一段请求代码。

  

import urllib.parse
import urllib.request# params  CategoryId=808 CategoryType=SiteHome ItemListActionName=PostList PageIndex=3 ParentCategoryId=0 TotalPostCount=4000
def getHtml(url,values):user_agent='Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'headers = {'User-Agent':user_agent}data = urllib.parse.urlencode(values)response_result = urllib.request.urlopen(url+'?'+data).read()html = response_result.decode('utf-8')return html#获取数据
def requestCnblogs(index):print('请求数据')url = 'http://www.cnblogs.com/mvc/AggSite/PostList.aspx'value= {'CategoryId':808,'CategoryType' : 'SiteHome','ItemListActionName' :'PostList','PageIndex' : index,'ParentCategoryId' : 0,'TotalPostCount' : 4000}result = getHtml(url,value)return result

  其实博客园这个请求还是挺标准的,哈哈正好适合抓取。因为他返回的就是一段html。(如果返回json那不是更好。。。。)

数据解析

  上文已经提到了,用到的是BeautifulSoup,好处就是不用自己写正则,只要根据他的语法来写就好了,在多次的测试之后终于完成了数据的解析。先上一段HTML。然后在对应下面的代码,也许看起来更轻松一些。

<div class="post_item"><div class="digg"><div class="diggit" onclick="DiggPost('hyper-xl',6417741,281238,1)"><span class="diggnum" id="digg_count_6417741">1</span></div><div class="clear"></div><div id="digg_tip_6417741" class="digg_tip"></div></div><div class="post_item_body"><h3><a class="titlelnk" href="http://www.cnblogs.com/hyper-xl/p/6417741.html" target="_blank">Python 字符串格式化</a></h3><p class="post_item_summary"><a href="http://www.cnblogs.com/hyper-xl/" target="_blank"><img width="48" height="48" class="pfs"src="//pic.cnblogs.com/face/795666/20160421231717.png" alt="" /></a>    转载请注明出处 Python2.6+ 增加了str.format函数,用来代替原有的'%'操作符。它使用比'%'更加直观、灵活。下面详细介绍一下它的使用方法。 下面是使用'%'的例子: 格式很像C语言的printf是不是?由于'%'是一个操作符,只能在左右两边各放一个参数,因此右边多个值需要用元组或 ...</p><div class="post_item_foot"><a href="http://www.cnblogs.com/hyper-xl/" class="lightblue">新月的力量_141</a>发布于 2017-02-19 23:07<span class="article_comment"><a href="http://www.cnblogs.com/hyper-xl/p/6417741.html#commentform" title="" class="gray">评论(0)</a></span><span class="article_view"><a href="http://www.cnblogs.com/hyper-xl/p/6417741.html" class="gray">阅读(138)</a></span></div></div><div class="clear"></div>
</div>

  通过上文的HTML代码可以看到几点。首先每一条数据都在 div(class="post_item")下。然后 div("post_item_body")下有用户信息,标题,链接,简介等信息。逐一根据样式解析即可。代码如下:

from bs4 import BeautifulSoup
import request
import re#解析最外层
def blogParser(index):cnblogs = request.requestCnblogs(index)soup = BeautifulSoup(cnblogs, 'html.parser')all_div = soup.find_all('div', attrs={'class': 'post_item_body'}, limit=20)blogs = []#循环div获取详细信息for item in all_div:blog = analyzeBlog(item)blogs.append(blog)return blogs#解析每一条数据
def analyzeBlog(item):result = {}a_title = find_all(item,'a','titlelnk')if a_title is not None:# 博客标题result["title"] = a_title[0].string# 博客链接result["href"] = a_title[0]['href']p_summary = find_all(item,'p','post_item_summary')if p_summary is not None:# 简介result["summary"] = p_summary[0].textfooters = find_all(item,'div','post_item_foot')footer = footers[0]# 作者result["author"] = footer.a.string# 作者urlresult["author_url"] = footer.a['href']str = footer.texttime = re.findall(r"发布于 .+? .+? ", str)result["create_time"] = time[0].replace('发布于 ','')comment_str = find_all(footer,'span','article_comment')[0].a.stringresult["comment_num"] = re.search(r'\d+', comment_str).group()view_str = find_all(footer,'span','article_view')[0].a.stringresult["view_num"] = re.search(r'\d+', view_str).group()return resultdef find_all(item,attr,c):return item.find_all(attr,attrs={'class':c},limit=1)

  上边一堆代码下来,着实花费了我不少时间,边写边调试,边百度~~不过还好最终还是出来了。等数据都整理好之后,然后我把它保存到了txt文件里面,以供其他语言来处理。本来想写个put直接put到ElasticSearch中,奈何没成功。后边在试吧,毕竟我的重点只是导数据,不在抓取这里。

import match
import os
import datetime
import jsondef writeToTxt(list_name,file_path):try:#这里直接write item 即可,不要自己给序列化在写入,会导致json格式不正确的问题fp = open(file_path,"w+",encoding='utf-8')l = len(list_name)i = 0fp.write('[')for item in list_name:fp.write(item)if i<l-1:fp.write(',\n')i += 1fp.write(']')fp.close()except IOError:print("fail to open file")#def getStr(item):
#   return json.dumps(item).replace('\'','\"')+',\n'def saveBlogs():for i in range(1,2):print('request for '+str(i)+'...')blogs = match.blogParser(i,5)#保存到文件path = createFile()writeToTxt(blogs,path+'/blog_'+ str(i) +'.json')print('第'+ str(i) +'页已经完成')return 'success'def createFile():date = datetime.datetime.now().strftime('%Y-%m-%d')path = '/'+dateif os.path.exists(path):return pathelse:os.mkdir(path)return pathresult = saveBlogs()
print(result)

如果大家对Python感兴趣的话,可以加一下我们的学习交流抠抠群哦:649825285,免费领取一套学习资料和视频课程哟~

  上边呢,我取了一百页的数据,也就是大概2000条做测试。

成果验收

  废了好大劲终于写完那些代码之后呢,就可以享受胜利的果实了,虽然是初学者,代码写的很渣,这参考一下,那参考一下,不过还是有些收获的。运行效果如下:

  

  生成的文件:

  

  文件内容:

  

总结

  一个简单的抓取程序就写完了,python还真是TM的好用。以后有空再研究研究吧。代码行数算上空行和注释总共 100 (50+25+25) 行。凑个整数好看点~~现在认识字我感觉就可以上手写程序了。这里百度一下,那里google一下,问题就解决了,程序也出来了,大功告成。

一个Python小白5个小时爬虫经历,分享一下相关推荐

  1. 一个Python小白5个小时爬虫经历

    最近业余在做一个基于.NET Core的搜索项目,奈何基层代码写好了,没有看起来很华丽的数据供测试.很巧的也是博客搜索,于是乎想到了博客园.C#也能做做页面数据抓取的,不过在博客园看到的大部分都是py ...

  2. python爬虫接单经历_一个Python小白5个小时爬虫经历

    环境搭建 既然用python,那么自然少不了语言环境.于是乎到官网下载了3.5版本的.安装完之后,随机选择了一个编辑器叫PyCharm,话说python编辑器还真挺多的.由于本人是小白,所以安装事项不 ...

  3. 一个Python白 5个小时爬虫经历

    前言 最近业余在做一个基于.NET Core的搜索项目,奈何基层代码写好了,没有看起来很华丽的数据供测试.很巧的也是博客搜索,于是乎想到了博客园.C#也能做做页面数据抓取的,不过在博客园看到的大部分都 ...

  4. python小白到大牛pdf_清华大学出版《python小白到大牛》PDF版分享

    <python从小白到大牛>PDF版,無偿分享! 作为过来人给大家分享一本python好书!超级全面,无敌!此书是一部系统论述 Python编程语言. OOP编程思想以及函数式编程思想的立 ...

  5. 记录一个python小白写问卷星定时答题代码的过程

    萌生想法的原因 学校的一些学分要自己抢公众号的活动修满的,要蹲点等公众号发的定时问卷开始填写,几乎秒没. 每次和舍友一起抢,发现大家手速网速各有不同,最后几家欢喜几家愁. 于是萌生了想法--通过代码解 ...

  6. 一个python自动下载论文的爬虫程序

    自动获取想要的论文 2/7更新: 我太蠢了,谷歌chrome浏览器ctrl+F可以搜索关键字,我写完才想起来百度一下(脑海里记得是有一个搜索快捷键的),写代码的好处就在于写好了就不用自己动手了,问题是 ...

  7. 来自一个Python小白写的DNF手搓脚本

    昨晚心血来潮,写了一个DNF"手搓"脚本,脚本很简单,直接上代码: import pydirectinput from pynput import keyboarddef shou ...

  8. Python 小白上手的简单爬虫——肯德基——一蓑烟雨任平生

    老规矩,直接上代码 # -*- coding: utf-8 -*- """ @Time : 2021/1/22 10:46 @Auth : 张张呀 @File :肯德基. ...

  9. python培训班骗局-深圳盐田区python专业培训机构,真实经历分享

    深圳盐田区python专业培训机构,随着疫情接近尾声,深圳Python培训 如何复工增收,解决生存问题?如何低成本启动,开展线上培训业务? 这里给大伙的都是精华,我学的时候安排上的内容有:Python ...

最新文章

  1. ckc交易什么意思_限价委托是什么意思?有限制的委托交易
  2. filco蓝牙不好用_2020双十二机械键盘选购 牌子推荐 附雷柏/ikbc/akko/杜伽/FILCO热销机械键盘品牌...
  3. 计算机科学与技术年会,2017年全国理论计算机科学学术年会在武汉召开
  4. .Net4.0 Parallel编程(三)Data Parallelism下
  5. sap模块有哪些_SAP那些事-实战篇-21-关于COPA模块的总结
  6. 删除排序数组中的重复数字
  7. Mysql查询高速缓存区
  8. java闭包lambda,(lambda)函数闭包捕获了什么?
  9. 视频文件损坏怎么修复,赤兔视频修复软件助您
  10. 博士申请 | 美国匹兹堡大学高伟教授招收Mobile AI方向全奖博士生
  11. linux mariadb,linux配置mariaDB
  12. 想学大数据?先看完这几本书再说
  13. Java语言程序设计D实验——类与对象实验
  14. bzoj1778 驱赶猪猡/luogu2937 赶小猪
  15. 微软 文档转换服务器,文档转换器
  16. 《灵魂的事-节选》(史铁生)
  17. Trips CodeForces - 1037E
  18. 英国访问学者T5签证所需相关材料
  19. 华为荣耀android进入,华为荣耀 进入工程模式的方法
  20. 回望2019:江城芜湖的“科技智变”

热门文章

  1. 2021年小红书美妆护肤品类行业洞察报告
  2. 巨量引擎短视频广告价值白皮书
  3. python高阶函数、map reduce 自己如何去定义_「python」高阶函数map、reduce的介绍
  4. 作者:季统凯(1972-),男,博士,中国科学院云计算产业技术创新与育成中心研究员...
  5. 【软件工程】极限编程
  6. 【软件工程】系统规划的不同方法
  7. 【数据库系统】DBMS、DBS、DBA、DB的区别
  8. offset;scroll;client
  9. vue-cli打包后的思索--代码优化
  10. 如何在SQL Server数据库中加密数据