环境搭建

既然用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。然后在对应下面的代码,也许看起来更轻松一些。

1

Python 字符串格式化

src="//pic.cnblogs.com/face/795666/20160421231717.png" alt="" />

转载请注明出处 Python2.6+ 增加了str.format函数,用来代替原有的'%'操作符

。它使用比'%'更加直观、灵活。下面详细介绍一下它的使用方法。 下面是使用'%'的例子: 格式很像C语言的printf是不是?由于'%'是一个操作符,只能在左右

两边各放一个参数,因此右边多个值需要用元组或 ...

新月的力量_141

发布于 2017-02-19 23:07

评论(0)

阅读

(138)

通过上文的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].text

footers = find_all(item,'div','post_item_foot')

footer = footers[0]

# 作者

result["author"] = footer.a.string

# 作者url

result["author_url"] = footer.a['href']

str = footer.text

time = re.findall(r"发布于 .+? .+? ", str)

result["create_time"] = time[0].replace('发布于 ','')

comment_str = find_all(footer,'span','article_comment')[0].a.string

result["comment_num"] = re.search(r'\d+', comment_str).group()

view_str = find_all(footer,'span','article_view')[0].a.string

result["view_num"] = re.search(r'\d+', view_str).group()

return result

def 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 json

def writeToTxt(list_name,file_path):

try:

#这里直接write item 即可,不要自己给序列化在写入,会导致json格式不正确的问题

fp = open(file_path,"w+",encoding='utf-8')

l = len(list_name)

i = 0

fp.write('[')

for item in list_name:

fp.write(item)

if i

fp.write(',\n')

i += 1

fp.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 = '/'+date

if os.path.exists(path):

return path

else:

os.mkdir(path)

return path

result = saveBlogs()

print(result)

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

成果验收

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

生成的文件:

文件内容:

总结

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

多学点,总不会吃亏的。

python爬虫接单经历_一个Python小白5个小时爬虫经历相关推荐

  1. python中难的算法_一个python的比较难的算法,有懂的人可以进来一下

    问 题 我的需求: 结构数据是这样的: 要求按照这样的公式: 组合一: 时间词+地方词+动词+等级+名词+价格词: 比如 2016年深圳大鹏新区给健康全身检查要多少钱 就是按照这样的公式组合出来的关键 ...

  2. python爬虫爬取新闻实战01:小白如何迅速学会爬虫爬取上千条新闻

    爬虫爬取新闻实战01:小白如何迅速学会爬虫爬取千条新闻 文章目录 爬虫爬取新闻实战01:小白如何迅速学会爬虫爬取千条新闻 1.前言 2 .爬虫原理介绍 2.1.图片爬虫 2.2 文字爬虫 3.用八爪鱼 ...

  3. 永恒python配合什么主武器_让Python代码更易维护的七种武器

    检查你的代码的质量,通过这些外部库使其更易维护. 可读性很重要. 随着软件项目进入"维护模式",对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准).然而,在代码 ...

  4. python自动生成word报告_利用Python实现报告自动生成

    前几天,在网上看到一篇介绍利用Python组件实现MS word内容生成的文章.可能是很久没接触编码,感觉在技术领域变得有点孤陋寡闻了,看见一些实用的功能都觉的屌屌的.以前经常通过代码写Excel文件 ...

  5. python爬虫设计在哪里_《python 爬虫教程 知乎》 怎样用Python设计一个爬虫模拟登陆知乎...

    <python 爬虫教程 知乎> 怎样用Python设计一个爬虫模拟登陆知乎 python 爬虫教程 知乎2020-09-23 01:45:13人已围观 怎样用Python设计一个爬虫模拟 ...

  6. python爬虫工程师考试科目一_一个Python爬虫工程师的修养

    练武不练功,到老一场空 练武的人都知道:练武不练功,到老一场空! 说的是只练花架子,不练习内功,最终也都是一个菜鸟级武师. 学习编程何尝不是!我时常见到已经学习相当一段时间的程序员,连稍微深点的基本知 ...

  7. python websocket库有什么_常用Python爬虫与Web开发库有哪些?

    Python爬虫和Web开发均是与网页相关的知识技能,无论是自己搭建的网站还是爬虫爬去别人的网站,都离不开相应的Python库,以下是常用的Python爬虫与Web开发库. **1.爬虫库** bea ...

  8. 用python画爱心动图_编写Python爬虫抓取暴走漫画上gif图片的实例分享

    本文要介绍的爬虫是抓取暴走漫画上的GIF趣图,方便离线观看.爬虫用的是python3.3开发的,主要用到了urllib.request和BeautifulSoup模块. urllib模块提供了从万维网 ...

  9. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

最新文章

  1. 一分钟就可以轻松将文字转换成语音,简单方法讲解
  2. PHP算法之四大基础算法
  3. NYOJ 7 街区最短路径问题
  4. 写给设计师同学的xcode使用教程: 教你用 Xcode 做原型设计
  5. Android分享中, 过滤指定的应用,已经过滤蓝牙, 并且对不同的分享方式发送不同的内容?...
  6. ActiveMQ的Transport Connectors配置(六)
  7. cmake 安装mysql5.6_CMAKE安装MYSQL 5.6.10
  8. 红旗linux mysql_恢复 - 红旗Linux案例精选:Amanda集中备份实例详细讲解_数据库技术_Linux公社-Linux系统门户网站...
  9. python 爬虫 音乐下载 歌手_python爬虫批量下载全民K歌音乐
  10. element ui table组件扩展关于列表编辑按钮的位置放置
  11. 谷歌查询mysql,谷歌地图:使用mysql查询更新标记不起作用
  12. Unity3DGUI:刚体碰撞及消息传递
  13. bios刷写工具_不仅仅带来新功能!以戴尔游戏本为例的更新BIOS详细教程
  14. Python自动生成新闻报告
  15. geogebra软件使用总结
  16. 在线旅游OTA行业调研报告-携程美团同程飞猪booking对比分析
  17. 高并发高可用高可靠性的千人千面项目技术架构分析
  18. 【操作系统安全】_Win7Win8系列提权漏洞
  19. OA新增百亿市场,蓝凌、钉钉靠“智能OA”占稳C位
  20. EMC磁珠到底什么样的特性

热门文章

  1. C51位运算应用技巧
  2. python共享内存和分布式实现异步加载数据
  3. openface 和openpose(pytorch)剪枝之路
  4. SSM框架下结合 log4j、slf4j打印日志
  5. 推荐一些网站给大家[转]
  6. 编译可在Android上运行的qemu user mode
  7. hadoop集群时间同步
  8. 【VMCloud云平台】私有云门户第一朵Web云(一)
  9. 书籍推荐——按内容划分
  10. access database in a helper function ?