前期准备

linux与vagrant

写python个人感觉还是比较偏向于linux,老实说现在除了打打游戏之外会用到window之外,上课,学习,工作等等都已转到linux,因为linux给了我更大的自由和权限。所以我在我的macbook通过了virtualbox与vagrant搭建了一个虚拟环境,其实这样也方便我的备份和随时切换。

python与virtualenv

python的本班是2.7.9,使用virtualenv开启了一个独立的Python环境,使各个python项目之间的依赖等等不互相影响。

版本一,抓取百思不得姐的段子

请求地址

http://www.budejie.com/new-text/2

构造请求页面

#!/usr/bin/env python
# -*- coding: utf-8 -*-import urllib2page = 1
url = 'http://www.budejie.com/new-text/' + str(page)
try:de_url = url + str(page)request = urllib2.Request(url)response = urllib2.urlopen(request)print response.read().decode('utf-8')
except urllib2.URLError, e:if hasattr(e, "code"):print e.codeif hasattr(e, "reason"):print e.reason

居然失败了

403
Forbidden

加上headers验证

#!/usr/bin/env python
# -*- coding: utf-8 -*-import urllib2page = 1
url = 'http://www.budejie.com/new-text/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
try:de_url = url + str(page)request = urllib2.Request(de_url, headers=headers)response = urllib2.urlopen(request)print response.read().decode('utf-8')
except urllib2.URLError, e:if hasattr(e, "code"):print e.codeif hasattr(e, "reason"):print e.reason

成功了打印了html

抓取某一页的所有段子

审查元素

可以看到 段子都包含在帖子列表下 <div class="j-r-list"></div>下,一个段子都为一个li。先看看发送邮件的效果。

那也就是抓取头像,作者,内容。这里直接采用正则来匹配,紧接上面的代码。

content = response.read().decode('utf-8')
pattern = re.compile(r'<div.*?u-img">.*?<img.*?u-logo.*?data-original="(.*?)".*?<div.*?u-txt.*?_blank">(.*?)</a>.*?<div.*?j-r-list-c-desc">.*?html">(.*?)</a>.*?.*?j-r-list-tool-l-up.*?<span>(.*?)</span>.*?</div>', re.S)
outputs = re.findall(pattern, content)for output in outputs:print output[1] + ':' + output[2] + '-->' + output[1] + '\n'

关于上面的正则表达式的几点说明

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

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

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

这里已经实现了抓取该页下的段子了。

版本二,抓取糗事百科的段子

请求地址 http://www.qiushibaike.com/hot/page/2

审查一下元素

可以发现每个段子的都是一个<div class="article block untagged mb15"

这里就使用了BeautifulSoup来抓取。

关于如何安装BeautifulSoup,可直接用pip安装。这里的BeautifulSoup版本是第4版。

抓取所有段子

from bs4 import BeautifulSouppage = 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)response = urllib2.urlopen(request)content = response.read().decode('utf-8')soup = BeautifulSoup(content, "lxml")items = soup.find_all(name='div', class_='article block untagged mb15')print itemsexcept urllib2.URLError, e:if hasattr(e, "code"):print e.codeif hasattr(e, "reason"):print e.reason

关于BeautifulSoup的使用方法可以看它的官方文档。

抓取单个段子信息

def print_qiushi(item):# 过滤有图片的段子if item.find('div', class_='thumb'):return# 过滤有视频的段子if item.find(name="div", class_='video_holder'):return# 获取揭晓这条段子的用户名author = item.find("div", class_='author')if author != None:author = author.get_text().strip()else:author = 'anonymous'# 获取用户名头像avatar = item.find("img")img = avatar['src']if str(img).strip() == '':img = "http://mpic.spriteapp.cn/profile/large/2016/12/03/58427c5196782_mini.jpg"# 获取段子内容content = item.find("div", class_='content').get_text().strip()data = {'author': '%s' % author,'img': '%s' % img,'content': '%s' % content,'created_time': '%s' % time.strftime("%Y-%m-%d %H:%M:%S")}return data

完整代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Filename : get_csbk
# @Author   : asd
# @Date     : 2017-02-23 17:40import urllib2import time
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf-8')from Utils import myutilsdef main():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)response = urllib2.urlopen(request)content = response.read().decode('utf-8')soup = BeautifulSoup(content, "lxml")items = soup.find_all(name='div', class_='article block untagged mb15')result = list()for item in items:if item:result.append(print_qiushi(item))print resultexcept urllib2.URLError, e:if hasattr(e, "code"):print e.codeif hasattr(e, "reason"):print e.reasondef print_qiushi(item):# 过滤有图片的段子if item.find('div', class_='thumb'):return# 过滤有视频的段子if item.find(name="div", class_='video_holder'):return# 获取揭用户名author = item.find("div", class_='author')if author != None:author = author.get_text().strip()else:author = 'anonymous'# 获取用户头像avatar = item.find("img")img = avatar['src']if str(img).strip() == '':img = "http://mpic.spriteapp.cn/profile/large/2016/12/03/58427c5196782_mini.jpg"# 获取段子内容content = item.find("div", class_='content').get_text().strip()data = {'author': '%s' % author,'img': '%s' % img,'content': '%s' % content,'created_time': '%s' % time.strftime("%Y-%m-%d %H:%M:%S")}return dataif __name__ == '__main__':main()

未完待续

转载于:https://my.oschina.net/asd945/blog/890983

爬虫抓取段子模拟订阅功能相关推荐

  1. Python爬虫--抓取糗事百科段子

    今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单.程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该 ...

  2. python段子_Python抓取段子的爬虫

    问题导读 1.Python抓取段子的爬虫的需求是什么? 2.Python抓取段子的爬虫是如何实现的? 3.你认为该如何实现? 1.需求按下回车键,显示一个段子,要求显示段子的作者.点赞数.评论数.顶等 ...

  3. python爬虫资源大全_Python爬虫抓取纯静态网站及其资源(基础篇)

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:程序员宝库 **( 想要学习Python?Python ...

  4. 如何用python爬股票数据_python爬虫股票数据,如何用python 爬虫抓取金融数据

    Q1:如何用python 爬虫抓取金融数据 获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为 ...

  5. 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api

    TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...

  6. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

  7. 爬虫抓取页面数据原理(php爬虫框架有很多 )

    爬虫抓取页面数据原理(php爬虫框架有很多 ) 一.总结 1.php爬虫框架有很多,包括很多傻瓜式的软件 2.照以前写过java爬虫的例子来看,真的非常简单,就是一个获取网页数据的类或者方法(这里的话 ...

  8. python爬虫招聘-Python爬虫抓取智联招聘(基础版)

    原标题:Python爬虫抓取智联招聘(基础版) 作者:C与Python实战 「若你有原创文章想与大家分享,欢迎投稿.」 对于每个上班族来说,总要经历几次换工作,如何在网上挑到心仪的工作?如何提前为心仪 ...

  9. python爬app_Python爬虫抓取手机APP的传输数据

    大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1.抓取APP数据包 方法详细可以参考这篇博文:Fiddler如何抓取手机 ...

最新文章

  1. 关于大型网站技术演进的思考(一)--存储的瓶颈(上)
  2. matlab三参数拟合函数,数据拟合,有三个参数,提示拟合参数太多,谢谢您啦!...
  3. Leetcode 106. 从中序与后序遍历序列构造二叉树 解题思路及C++实现
  4. UA MATH566 统计理论5 假设检验简介
  5. 真实临床“生态”下实效性研究的挑战和意义
  6. micropython esp32手册_使用ESP32控制板(二):燒錄MicroPython韌體
  7. RPM安装包-Spec文件參数具体解释与演示样例分析
  8. oracle 数据抽取 java_oracle数据抽取步骤
  9. c语言头文件_C语言学习之头文件的原理和使用方法
  10. 第一个程序(python)-helloworld_创建第一个python程序:‘Hello World!’
  11. 【报告分享】2020-2021跨境出口电商增长白皮书.pdf(附下载链接)
  12. Linux CentOS7 下安装 TeamViewer
  13. 【网络安全面试题】——文件目录穿越实现特权文件读取
  14. 在HttpClient请求的时候,返回结果解析时出现java.io.IOException: Attempted read from closed stream. 异常,解决
  15. 16张扑克逻辑思维问题详解
  16. 分享6个目前网上赚钱比较稳定的方法!
  17. 【CV】膨胀卷积详解以及时间卷积网络TCN论文笔记和源码实现
  18. element ui dialog custom-class不生效最终解决办法
  19. 医院三级医院信息系统验收标准
  20. HTML5热气球飞行游戏代码

热门文章

  1. 初识面向对象二(继承/抽象/C3)
  2. android surfaceview 大小,Android设置SurfaceView任意大小、任意位置、保持预览宽高比与屏...
  3. 连接池中的maxIdle,MaxActive,maxWait参数
  4. linux添加用户出现错误/usr/bin/xauth: file /home/chenwi/.Xauthority does not exist
  5. c语言删除非空文件夹
  6. 买火车票经典文章两则 (转)
  7. SQLsever查询结果,数据后面总是有很多空格
  8. oracle to_caht,【Amazing China 】甲骨文表情包上线,让你一眼看懂甲骨文
  9. mysql查询数据库的连接数_MySQL数据库之如何实时查看mysql当前连接数?
  10. 汤姆大叔深入理解JavaScript系列