闲来无事,学学python爬虫。

在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门。

1.获取糗事百科url

2.先抓取HTML页面

importurllibimporturllib2importre

page= 2url= 'http://www.qiushibaike.com/hot/page/' +str(page) #对应第2页的urlrequest= urllib2.Request(url) #发出申请

response= urllib2.urlopen(request) #收到回应

当然这里可能会产生error:主要有HTTPError和URLError。

产生URLError的原因可能是:

网络无连接,即本机无法上网

连接不到特定的服务器

服务器不存在

异常捕获解决办法:

importurllib2

requset= urllib2.Request('http://www.xxxxx.com')try:

urllib2.urlopen(request)excepturllib2.URLError, e:printe.reason

HTTPError是URLError的子类,利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。举个例子,假如response是一个”重定向”,需定位到别的地址获取文档,urllib2将对此进行处理。常见的状态码:

200:请求成功      处理方式:获得响应的内容,进行处理

202:请求被接受,但处理尚未完成    处理方式:阻塞等待

204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。    处理方式:丢弃

404:没有找到     处理方式:丢弃

500:服务器内部错误  服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。

异常捕获解决办法:

importurllib2

req= urllib2.Request('http://blog.csdn.net/cqcre')try:

urllib2.urlopen(req)excepturllib2.HTTPError, e:printe.codeprint e.reason

注:HTTPError是URLError的子类,在产生URLError时也会触发产生HTTPError。因此应该先处理HTTPError。上述代码可改写为:

importurllib2

req= urllib2.Request('http://blog.csdn.net/cqcre')try:

urllib2.urlopen(req)excepturllib2.HTTPError, e:printe.codeexcepturllib2.URLError, e:printe.reasonelse:print "OK"

如果无法获得回应,可能需要加入header模拟浏览器发出请求:

importurllibimporturllib2

page= 1url= 'http://www.qiushibaike.com/hot/page/' +str(page)

user_agent= 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers= { 'User-Agent': user_agent }try:

request= urllib2.Request(url,headers =headers) # 加入header

response=urllib2.urlopen(request)printresponse.read()excepturllib2.URLError, e:if hasattr(e,"code"):printe.codeif hasattr(e,"reason"):print e.reason

3.分析页面获取段子

如上图所示,划红对勾的是不同的段子,每个段子都由

...

包裹起来。我们点开其中一个,获取其中的用户名、段子内容和点赞数这三个信息。这三个信息分别用红、蓝、黑下划线圈起来。解析过程主要由正则表达式实现。

解析用户名。正则表达式为:

.*?

(.*?)

上图中用户名称为旖旎萌萌,处于

中间,用(.*?)代之。

解析段子内容。正则表达式为:

(.*?)  同理,文字部分在和之间。

之间的所有符号(含换行符)用.*?解决。

解析点赞数。正则表达式为:

.*?"number">(.*?)  同理。用(.*?)代替1520。

正则表达式解释:(参考崔庆才博客)

1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。

2)(.*?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。

3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。

content = response.read().decode('utf-8')

pattern= re.compile('

.*?

(.*?)

.*?(.*?).*?

.*?"number">(.*?)',re.S)

items= re.findall(pattern,content) # 参考python中的re模块,作用是在content中寻找可以匹配pattern的串,即段子

但是有个问题,上面的表达式将有图和无图的段子都爬取下来了,但是在图片一般不会显示,所以需要去掉有图的段子,只爬取无图片的段子。需要稍微改动正则表达式。

上图是无图的段子html代码,下图是有图的段子的html代码:

红线划的

包含了图片部分,而这条语句在无图段子的html中是不存在的,所以利用这条语句中的“img”(上图下划线)来过滤段子。同时注意到这条语句处在段子内容和点赞数中间。

所以在段子内容和点赞这两个正则语句之间加上一个(.*?)即可,这样一来,只要检测到包括“img”,就过滤掉。

content = response.read().decode('utf-8')

pattern= re.compile('

.*?

(.*?)

.*?(.*?)(.*?)

.*?"number">(.*?)' # 注意这个(.*?),re.S)

items=re.findall(pattern,content) # items就是根据正则表达式筛选到的字符串(html串)for item initems:

haveImg= re.search("img", item[2]) # 0,1,2,3分别表示用户名,段子内容,图片,点赞数。所以用item[2]来检测过滤if nothaveImg:print item[0], item[1], item[3]

好,以上代码就是可以实现将一页中的无图段子全部爬取出来:代码:

importurllibimporturllib2importre

page= 2url= 'http://www.qiushibaike.com/hot/page/' +str(page)

user_agent= 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers= {'User-Agent':user_agent}

request= urllib2.Request(url, headers=headers)

response=urllib2.urlopen(request)

content= response.read().decode('utf-8')

pattern= re.compile('

.*?

(.*?)

.*?(.*?)(.*?)

.*?"number">(.*?)',re.S)

items=re.findall(pattern,content)for item initems:

haveImg= re.search("img", item[2])if nothaveImg:print item[0], item[1], item[3]

4.以上代码是核心,但是略有简陋,稍加修补:

#coding:utf-8

importurllibimporturllib2importreclassSpider_QSBK:def __init__(self):

self.page_index= 2self.enable=False

self.stories=[]

self.user_agent= 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'self.headers= {'User-Agent':self.user_agent}defgetPage(self, page_index):

url= 'http://www.qiushibaike.com/hot/page/' +str(page_index)try:

request= urllib2.Request(url, headers=self.headers)

response=urllib2.urlopen(request)

content= response.read().decode('utf-8')returncontentexcepturllib2.URLError, e:printe.reasonreturnNonedefgetStories(self,page_index):

content=self.getPage(page_index)

pattern= re.compile('

.*?

(.*?)

.*?(.*?)(.*?)

.*?"number">(.*?)',re.S)

items=re.findall(pattern,content)for item initems:

haveImg= re.search("img", item[2])if nothaveImg:

self.stories.append([item[0], item[1], item[3]])returnself.storiesdefShowStories(self, page_index):

self.getStories(page_index)for st inself.stories:print u"第%d页\t发布人:%s\t点赞数:%s\n%s" %(page_index, st[0], st[2], st[1])delself.storiesdefstart(self):

self.enable=True#while self.enable:

self.ShowStories(self.page_index)

self.page_index+= 1spider=Spider_QSBK()

spider.start()

结果一样:

python爬虫经典段子_Python爬虫-爬取糗事百科段子相关推荐

  1. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  2. Python爬虫实战之爬取糗事百科段子

    Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...

  3. Python爬虫实战一之爬取糗事百科段子

    点我进入原文 另外, 中间遇到两个问题: 1. ascii codec can't decode byte 0xe8 in position 0:ordinal not in range(128) 解 ...

  4. 【Python爬虫系列教程 28-100】小姐姐带你入门爬虫框架Scrapy、 使用Scrapy框架爬取糗事百科段子

    文章目录 Scrapy快速入门 安装和文档: 快速入门: 创建项目: 目录结构介绍: Scrapy框架架构 Scrapy框架介绍: Scrapy框架模块功能: Scrapy Shell 打开Scrap ...

  5. 爬虫实战1:爬取糗事百科段子

    本文主要展示利用python3.7+urllib实现一个简单无需登录爬取糗事百科段子实例. 如何获取网页源代码 对网页源码进行正则分析,爬取段子 对爬取数据进行再次替换&删除处理易于阅读 0. ...

  6. Python3写爬虫(五)爬取糗事百科段子

    2019独角兽企业重金招聘Python工程师标准>>> 最近几天开始用Python3改写网上用Python2写的案例,发现完全可以用Python3来重构Python2的源码.本篇文章 ...

  7. 网络爬虫---爬取糗事百科段子实战

    Python网络爬虫 1.知识要求 掌握python基础语法 熟悉urllib模块知识 熟悉get方法 会使用浏览器伪装技术 如果您对相关知识遗忘了,可以点上面的相关知识链接,熟悉一下. 2.爬取糗事 ...

  8. 【网络爬虫】爬取糗事百科段子

    1.前言 自动爬取糗事百科段子,使用Python编写. 输出文件路径需根据实际自己修改哦,默认的是输出100条段子,终止条件可以自己设置. 另糗事百科可能会改版,如有问题,欢迎留言,或者自行更改正则表 ...

  9. Python爬取糗事百科段子+定时发送QQ邮箱

    文章目录 前言 1. 库导入及介绍 2. 获取网页源码 3. 提取需要的信息 4. 优化输出数据 5. 发送邮件 6. 实现定时发送 7. 源码 前言 学习Python爬虫也有段时间了,总想着搞点事做 ...

  10. Python之爬取糗事百科段子实战

    "简说Python",选择"置顶/星标公众号" 福利干货,第一时间送达! 阅读本文大约6分钟,实战学习,老表建议你反复看,反复记,反复练. // 本文作者 王豪 ...

最新文章

  1. Windows phone 应用开发[12]-Pex 构建自动化白盒测试[下]
  2. ansible编译httpd playbook示例
  3. vue-datepicker的使用
  4. 【转】sqlserver使用sql导出索引
  5. 计算机桌面打开图像管理,如何给电脑桌面设置几张图片自动播放
  6. oracle 恢复学习 案例1 一个数据文件丢失 完全恢复数据库
  7. win11如何退出磁贴桌面 Windows11退出磁贴桌面的设置方法
  8. 手撸 webpack4.x 配置(二)
  9. 模板题——质数、素数、约数
  10. maven pom聚合与继承
  11. 数据结构Java第四版pdf_数据结构与抽象:Java语言描述(原书第4版) 中文pdf完整版[131MB]...
  12. Ubuntu 21.10 编写 eBPF tc 程序
  13. grub.exe和grldr的区别和联系
  14. 机器学习算法——支持向量机SVM4(SMO算法及KTT条件)
  15. LINUX——账号和权限管理
  16. IPLC专线使用心得,速度惊人!
  17. 60.left join(左连接)
  18. 初试加解密工具RSA Tool 1.7
  19. 如何选购计算机硬件,DIY攒机经验之谈:十年老司机教你组装电脑如何选购硬件...
  20. 蓝桥试题 算法训练 绘制地图 __Java

热门文章

  1. 2003域服务器 d盘部分共享文件夹突然不见 但分大小没变化,服务器共享文件夹权限...
  2. python从图片提取文字_Python从图片提取文字
  3. 【个人简记】6R机器人几何参数标定
  4. VS CODE 安装vetur后不生效问题解决
  5. 北师大计算机科学与技术辅修,在北师大,辅修是一种怎样的体验?
  6. Codeforces Round #525 (Div. 2) D Ehab and another another xor problem
  7. linux下载TCGA数据,TCGA数据库讲解与数据下载
  8. Windows 10 命令提示符——快捷键
  9. 带你领略极致简便的报表生成工具——阿里的easyExcel
  10. Anaconda3 下载安装详细步骤【图文详细教程】