最近开始学Python的爬虫,是在这个博客跟着学习的,该博主用的是Python 2.7版本,而我使用的是3.5版本,很多不兼容的地方,不过没关系,自己改改就好了。

我们想针对网站的内容进行筛选,只获取自己感兴趣的部分。比如你想在XX网站把小黄图筛选出来,打包带走。这里只做简单的实现,以百思不得姐上的段子(纯文本)为例。我们想要实现如下功能:

批量下载若干页段子到本地文件中

按下任意一键,开始阅读下一条段子

1. 获取网页代码

导入urllib的相关库,Python 3中应该这样写:

import urllib.request

import urllib.parse

import re

re库是正则表达式(Regular Expression),后面作匹配时会用到。

百思不得姐的段子页面url ='http://www.budejie.com/text/1',这里末尾数字1代表此为第一页。通过以下代码就能返回网页内容。

req = urllib.request.Request(url)

# 添加headers 使之看起来像浏览器在访问

req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '

'(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36')

response = urllib.request.urlopen(req)

# 得到网页内容,注意必须使用decode()解码

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

print(html)的话,就是如下所示的内容:

这能看?段子呢?我们想要的段子呢?!

哦对了headers这样查看。

按F12,然后...看图吧

2. 正则匹配提取段子

要想筛选符合普通人阅读的内容(如果还带着html标签那还咋读是不),成功提取出段子,为此我们需要一些既定的模式去和网页全部内容进行匹配,将模式下匹配成功的对象返回。我们使用强大的正则表达式进行匹配(Regular Expression),相关语法可以看这里。

仅仅针对本例中的网页内容,先看看我们需要的段子对应了网页中的什么内容。

可以看到段子被

(我们要的内容)

这样的标签所包围,只需要指定相应规则提取出来即可!上图可以看出段子正文前后是有很多空格的,需要匹配进去。

pattern = re.compile(r'

\s+(.*)\s+

')

result = re.findall(pattern, html)

通过re库的compile函数制定规则。

\s+可以匹配一个或更多的空格

.匹配除开换行符\n外的所有字符。

现在我们得到了匹配后的结果,来看下。

Bingo!提取出来了不是?!

可是我们发现里面还有些讨厌的
。没关系,写几行代码的事。这里就不再展示去掉后的内容,自行脑补哈哈。

for each in content:

# 如果某个段子里有

if '
' in each:

# 替换成换行符并输出

new_each = re.sub(r'
', '\n', each)

print(new_each)

# 没有就照常输出

else:

print(each)

这里content由get_content方法返回,表示所有获取到的段子列表。get_content方法下面会给出实现。

至此,我们成功得到我们想看的段子了!如果想要下载到本地呢?

3. 下载段子到本地

通过定义一个save()函数即可,num参数用户自定,想下载最近100页的内容都没问题!里面还有些变量没有提到,最后会给出源代码。

# num是指定网页页数

def save(num):

# 写方式打开一个文本,把获取的段子列表存放进去

with open('a.txt', 'w', encoding='utf-8') as f:

text = get_content(num)

# 和上面去掉
类似

for each in text:

if '
' in each:

new_each = re.sub(r'
', '\n', each)

f.write(new_each)

else:

f.write(str(each) + '\n')

下载到本地文档后如下图所示

4. 逐条读取段子

段子太多,琳琅满目。可我们只希望一条条阅读。通过按下键盘任意键可以切换到下一条,直到读取到最后一条程序才结束,或者通过设置一个退出键随时退出程序,比如设定q键退出。这里把全部代码给出。

import urllib.request

import urllib.parse

import re

pattern = re.compile(r'

\s+(.*)\s+

')

# 返回指定网页的内容

def open_url(url):

req = urllib.request.Request(url)

req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '

'(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36')

response = urllib.request.urlopen(req)

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

return html

# num为用户自定,返回的是所有页的段子列表

def get_content(num):

# 存放段子的列表

text_list = []

for page in range(1, int(num)):

address = 'http://www.budejie.com/text/' + str(page)

html = open_url(address)

result = re.findall(pattern, html)

# 每一页的result都是一个列表,将里面的内容加入到text_list

for each in result:

text_list.append(each)

return text_list

# num是指定网页页数

def save(num):

# 写方式打开一个文本,把获取的段子列表存放进去

with open('a.txt', 'w', encoding='utf-8') as f:

text = get_content(num)

# 和上面去掉
类似

for each in text:

if '
' in each:

new_each = re.sub(r'
', '\n', each)

f.write(new_each)

else:

f.write(str(each) + '\n')

if __name__ == '__main__':

print('阅读过程中按q随时退出')

number = int(input('想读几页的内容: '))

content = get_content(number + 1)

for each in content:

if '
' in each:

new_each = re.sub(r'
', '\n', each)

print(new_each)

else:

print(each)

# 用户输入

user_input = input()

# 不区分大小写的q,输入则退出

if user_input == 'q' or user_input == 'Q':

break

演示一下,效果是这样的。

虽然功能很鸡肋,不过作为初学我还是很满意了,有兴趣才能深入下去嘛!爬虫可不仅仅如此而已,以后会学习更加高级的功能。

by @sunhaiyu

2016.8.15

python爬虫深入爬取_Python爬虫初学(一)—— 爬取段子相关推荐

  1. python爬虫微博评论图片_python爬虫爬取微博评论

    原标题:python爬虫爬取微博评论 python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无 ...

  2. python爬虫教材推荐 豆瓣_Python爬虫入门教程:豆瓣Top电影爬取

    基本开发环境Python 3.6 Pycharm 相关模块的使用requests parsel csv 安装Python并添加到环境变量,pip安装需要的相关模块即可. 爬虫基本思路 一.明确需求 爬 ...

  3. python爬虫教材推荐 豆瓣_Python爬虫爬取豆瓣书籍数据

    炎热的夏天,酷暑难挡,难免会心烦意燥,睡前随手拿起枕边看过很多遍的「平凡的世界」.看书,会让躁动的心瞬间安静下来. 生活不能等待别人来安排,要自己去争取和奋斗:而不论其结果是喜是悲,但可以慰藉的是,你 ...

  4. python爬虫快速下载图片_Python爬虫入门:批量爬取网上图片的两种简单实现方式——基于urllib与requests...

    Python到底多强大,绝对超乎菜鸟们(当然也包括我了)的想象.近期我接触到了爬虫,被小小地震撼一下.总体的感觉就两个词--"强大"和"有趣".今天就跟大家分享 ...

  5. python发短信 金山_Python爬虫基础练习(四) 金山翻译爬取(进阶篇)

    上一篇文章金山翻译爬取(基础篇)讲到爬取金山翻译,并且实现了简单词汇的爬取,但是我们的报错信息都是一长串字符,就像这样 当然这个报错还是很容易看懂的,"列表索引超出范围",但是我们 ...

  6. pythonscrapy爬虫 崔庆才_Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  7. python爬图片_python爬虫(爬取图片)

    python爬虫爬图片 爬虫爬校花网校花的图片 第一步 载入爬虫模块#载入爬虫模块 import re #载入爬虫模块 import requests #载入爬虫模块 第二步 获得校花网的地址,获得其 ...

  8. python壁纸数据抓取_python爬虫系列之 xpath实战:批量下载壁纸

    一.前言 在开始写爬虫之前,我们先了解一下爬虫 首先,我们需要知道爬虫是什么,这里直接引用百度百科的定义网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照 ...

  9. python爬虫scrapy框架教程_Python爬虫教程-30-Scrapy 爬虫框架介绍

    从本篇开始学习 Scrapy 爬虫框架 Python爬虫教程-30-Scrapy 爬虫框架介绍 框架:框架就是对于相同的相似的部分,代码做到不出错,而我们就可以将注意力放到我们自己的部分了 常见爬虫框 ...

  10. python爬虫网络出错怎么办_Python爬虫常见问题

    第一个问题:JS加密如何突破 (1) 熟练掌握Chrome的开发者工具的各个功能,Elements, Network,Source (2) 认真观察,善于思考.Network查看加载流程,找可疑的xh ...

最新文章

  1. 根据ip获取地理位置
  2. java cache缓存_为什么 Java 中“1000==1000”为false,而”100==100“为true?
  3. 缺省参数-指定函数缺省参数的默认值
  4. Qt学习之路(28): 坐标变换
  5. linux命令怎么调wsdl,如何从命令行执行SOAP wsdl Web服务调用
  6. linux6.6 sudo环境变量,linux sudo环境变量设置
  7. 前端开发 css样式的简写
  8. 虚拟主机php.ini在哪里,虚拟主机的php.ini配置文件在哪里
  9. 点击加入购物车直接转到购物车页面
  10. mysql技术blog_Mysql技术 - 包子博客 _ 关注互联网前端、开发、SEO、移动互联网应用技术...
  11. 利用百度搜索结果爬取邮箱
  12. NIFI 自定义 processor 实现
  13. 3.JDBC基础代码书写
  14. 蓝桥杯T513---- 算法训练 素因子去重 java
  15. 计算机考研400分以上,考研400分是什么概念?
  16. [转自左潇龙的博客]设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)...
  17. 联合办公空间会员需要保险吗?
  18. 大数据 -- 数据倾斜
  19. 液压绞车液压系统设计
  20. 奥鹏英语计算机统考时间2019,【真题及答案】2019年4月网络教育统考《大学英语B》考试试题及答案[适用于奥鹏、电大国开、网络教育学...

热门文章

  1. datastage 函数_DataStage_Transformer常用函数
  2. 拨号云服务器怎么自动配置网关_如何解决路由器静态IP+PPPoE拨号双链路负载分担问题...
  3. mysql分区、分表学习
  4. kotlin学习之lambda(十)
  5. PooledDirectByteBuf源码分析
  6. 02.elasticsearch-meta-field元字段
  7. Spring容器创建过程
  8. CentOS7关于防火墙的命令
  9. 爬取豆瓣TOP250并将数据保存为txt文件和csv文件并存入MySQL数据库
  10. dfs时间复杂度_一文吃透时间复杂度和空间复杂度