python3制作捧腹网段子页爬虫


Posted in Python onFebruary 12, 2017

0x01

春节闲着没事(是有多闲),就写了个简单的程序,来爬点笑话看,顺带记录下写程序的过程。第一次接触爬虫是看了这么一个帖子,一个逗逼,爬取煎蛋网上妹子的照片,简直不要太方便。于是乎就自己照猫画虎,抓了点图片。

科技启迪未来,身为一个程序员,怎么能干这种事呢,还是爬点笑话比较有益于身心健康。

python3制作捧腹网段子页爬虫

0x02

在我们撸起袖子开始搞之前,先来普及点理论知识。

简单地说,我们要把网页上特定位置的内容,扒拉下来,具体怎么扒拉,我们得先分析这个网页,看那块内容是我们需要的。比如,这次爬取的是捧腹网上的笑话,打开 捧腹网段子页我们可以看到一大堆笑话,我们的目的就是获取这些内容。看完回来冷静一下,你这样一直笑,我们没办法写代码。在 chrome 中,我们打开 审查元素 然后一级一级的展开 HTML 标签,或者点击那个小鼠标,定位我们所需要的元素。

python3制作捧腹网段子页爬虫

最后可以发现 <div> 中的内容就是我们所需要的笑话,在看第二条笑话,也是这样。于是乎,我们就可以把这个网页中所有的 <div> 找到,然后把里边的内容提取出来,就完成了。

0x03

好了,现在我们知道我们的目的了,就可以撸起袖子开始干了。这里我用的 python3,关于 python2 和 python3 的选用,大家可以自行决定,功能都可以实现,只是有些许不同。但还是建议用 python3。
我们要扒拉下我们需要的内容,首先我们得把这个网页扒拉下来,怎么扒拉呢,这里我们要用到一个库,叫 urllib,我们用这个库提供的方法,来获取整个网页。
首先,我们导入 urllib

 import urllib.request as request

然后,我们就可以使用 request 来获取网页了,

def getHTML(url): 

return request.urlopen(url).read()

人生苦短,我用 python,一行代码,下载网页,你说,还有什么理由不用 python。
下载完网页后,我们就得解析这个网页了来获取我们所需要的元素。为了解析元素,我们需要使用另外一个工具,叫做 Beautiful Soup,使用它,可以快速解析 HTML 和 XML并获取我们所需要的元素。

soup = BeautifulSoup(getHTML("http://www.pengfu.com/xiaohua_1.html"))

用 BeautifulSoup 来解析网页也就一句话,但当你运行代码的时候,会出现这么一个警告,提示要指定一个解析器,不然,可能会在其他平台或者系统上报错。

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/__init__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.
The code that caused this warning is on line 64 of the file joke.py. To get rid of this warning, change code that looks like this:
 BeautifulSoup([your markup])
to this:
 BeautifulSoup([your markup], "lxml")
  markup_type=markup_type))

解析器的种类 和 不同解析器之间的区别 官方文档有详细的说明,目前来说,还是用 lxml 解析比较靠谱。
修改之后

soup = BeautifulSoup(getHTML("http://www.pengfu.com/xiaohua_1.html", 'lxml'))

这样,就没有上述警告了。

div_array = soup.find_all('div', {'class':"content-img clearfix pt10 relative"})

利用 find_all 函数,来找到所有 class = content-img clearfix pt10 relative 的 div 标签 然后遍历这个数组

for x in div_array: content = x.string

这样,我们就取到了目的 div 的内容。至此,我们已经达到了我们的目的,爬到了我们的笑话。
但当以同样的方式去爬取糗百的时候,会报这样一个错误

raise RemoteDisconnected("Remote end closed connection without" http.client.RemoteDisconnected: Remote end closed connection without response

说远端无响应,关闭了链接,看了下网络也没有问题,这是什么情况导致的呢?莫非是我姿势不对?
打开 charles 抓包,果然也没反应。唉,这就奇怪了,好好的一个网站,怎么浏览器可以访问,python 无法访问呢,是不是 UA 的问题呢?看了下 charles,发现,利用 urllib 发起的请求,UA 默认是 Python-urllib/3.5 而在 chrome 中访问 UA 则是 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36,那会不会是因为服务器根据 UA 来判断拒绝了 python 爬虫。我们来伪装下试试看行不行

def getHTML(url):

    headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}

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

    return request.urlopen(req).read()

这样就把 python 伪装成 chrome 去获取糗百的网页,可以顺利的得到数据。

至此,利用 python 爬取糗百和捧腹网的笑话已经结束,我们只需要分析相应的网页,找到我们感兴趣的元素,利用 python 强大的功能,就可以达到我们的目的,不管是 XXOO 的图,还是内涵段子,都可以一键搞定,不说了,我去找点妹子图看看。

# -*- coding: utf-8 -*-
import sys
import urllib.request as request
from bs4 import BeautifulSoup

def getHTML(url):
  headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
  req = request.Request(url, headers=headers)
  return request.urlopen(req).read()

def get_pengfu_results(url):
  soup = BeautifulSoup(getHTML(url), 'lxml')
  return soup.find_all('div', {'class':"content-img clearfix pt10 relative"})

def get_pengfu_joke():
  for x in range(1, 2):
    url = 'http://www.pengfu.com/xiaohua_%d.html' % x
    for x in get_pengfu_results(url):
      content = x.string
      try:
        string = content.lstrip()
        print(string + '\n\n')
      except:
        continue
  return

def get_qiubai_results(url):
  soup = BeautifulSoup(getHTML(url), 'lxml')
  contents = soup.find_all('div', {'class':'content'})
  restlus = []
  for x in contents:
    str = x.find('span').getText('\n','<br/>')
    restlus.append(str)
  return restlus

def get_qiubai_joke():
  for x in range(1, 2):
    url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4952526' % x
    for x in get_qiubai_results(url):
      print(x + '\n\n')
  return

if __name__ == '__main__':
  get_pengfu_joke()
  get_qiubai_joke()
Python 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
Python获取当前路径实现代码
May 08 Python
VTK与Python实现机械臂三维模型可视化详解
Dec 13 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
python的依赖管理的实现
May 14 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
python日志记录模块实例及改进
Feb 12 #Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 #Python
使用Python绘制图表大全总结
Feb 11 #Python
Python 绘图和可视化详细介绍
Feb 11 #Python
Python实现多线程HTTP下载器示例
Feb 11 #Python
Python  pip安装lxml出错的问题解决办法
Feb 10 #Python
使用Python脚本和ADB命令实现卸载App
Feb 10 #Python
You might like
虫族 Zerg 魔法科技
2020/03/14 星际争霸
php flush类输出缓冲剖析
2008/10/19 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
Python内建模块struct实例详解
2018/02/02 Python
Python实现抢购IPhone手机
2018/02/07 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
python计算两个数的百分比方法
2018/06/29 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python高斯消除矩阵
2019/01/02 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
公司领导推荐信
2013/11/12 职场文书
给国外客户的邀请函
2014/01/30 职场文书
保护环境的建议书
2014/03/12 职场文书
学校三节实施方案
2014/06/09 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
检讨书格式范文
2015/05/07 职场文书