关闭

简单爬取糗事百科

342人阅读 评论(0) 收藏 举报
分类:

刚刚入门,对于爬虫还要折腾很久才行,虽然很多功能还没开始掌握,但是爬取下来就很开心,接下来还会争取进步的。把自己出现的一些错误都加上了注释,我目前还在学习当中,大家一起进步。

期间学了一个新的函数,在这里分享下:

strip()

网上是这么说的

需要注意的是,传入的是一个字符数组,编译器去除两端所有相应的字符,直到没有匹配的字符,比如:

theString = 'saaaay yes no yaaaass'
print theString.strip('say') 

运行结果: 
yes no 

这里的两端,只是指向theString整个字符串两端的字符,即saaaaay 和yaaaass,将这两个单词,前后包含“s”,"a","y"三者之一的字符按顺序一一去掉,对于中间的“yes”是无效的。

如果没有指定的话,就会替换掉前后的空格。 当rm为空时,默认删除空白符(包括'\n', '\r',  '\t',  ' ')

所以如果需要替换掉一些<br/>之类的字符串,可以选择先将其用re.sub替换成空白符,然后在用strip()删除。

import urllib2
import re


url = 'http://www.qiushibaike.com/hot/page/'


def get_url(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'} #记得引号
    req=urllib2.Request(url,headers =headers)
    response = urllib2.urlopen(req)
    html = response.read().decode('utf-8')
    return html
    
    
def get_info(url):
    html = get_url(url)
    re_info = r'h2\>(.+?)\</h2\>.+?\<div class="content"\>(.+?)\</div\>.+?\<i class="number"\>(.+?)\</i'
    info_compile = re.compile(re_info,re.S)#多行使用re.S
    info = re.findall(info_compile,html)
    #return info 放进列表里面的是元组
    for story in info:
        re_text = re.compile('<br/>')
        text = re.sub(re_text,'',story[1])
        print u"发布人:%s\t 赞:%s\n%s" %(story[0],story[2],text)#\t为横向制表符
#前面加u啊啊啊啊
get_info(url)

接下来写循环的部分,其实只是在最后去掉get_info(url)再加上一点点的东西

def get_all(pages):
    for i in range(1,pages):
        url = start_url + str(i)
        get_info(url)
        
get_all(3)

接下来实现打印加上页码,回车打印每一个段子,更是只是加上一点点的东西,添加raw_input进行判断

def get_info(url,page):
    html = get_url(url)
    re_info = r'h2\>(.+?)\</h2\>.+?\<div class="content"\>(.+?)\</div\>.+?\<i class="number"\>(.+?)\</i'
    info_compile = re.compile(re_info,re.S)
    info = re.findall(info_compile,html)
    print u'正在读取,回车查看,Q退出'
    for story in info:
        input = raw_input()
        if input == 'Q':
            return
        re_text = re.compile('<br/>')
        text = re.sub(re_text,'',story[1])
        print u"第%d页\t发布人:%s\t 赞:%s\n%s" %(page,story[0],story[2],text)

如果没有更改url,会报出如下错误:

Traceback (most recent call last):

  File "<ipython-input-17-70dae055a5ee>", line 38, in <module>
    get_all(3)

  File "<ipython-input-17-70dae055a5ee>", line 34, in get_all
    url = url + str(i)

UnboundLocalError: local variable 'url' referenced before assignment

为了区分,我们将url换名为start_url,完整如下

import urllib2
import re


start_url = 'http://www.qiushibaike.com/hot/page/'


def get_url(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'} #记得引号
    req=urllib2.Request(url,headers =headers)
    response = urllib2.urlopen(req)
    html = response.read().decode('utf-8')
    return html
    
    
def get_info(url,page):
    html = get_url(url)
    re_info = r'h2\>(.+?)\</h2\>.+?\<div class="content"\>(.+?)\</div\>.+?\<i class="number"\>(.+?)\</i'
    info_compile = re.compile(re_info,re.S)
    info = re.findall(info_compile,html)
    print u'正在读取,回车查看,Q退出'
    for story in info:
        input = raw_input()
        if input == 'Q':
            return
        re_text = re.compile('<br/>')
        text = re.sub(re_text,'',story[1])
        print u"第%d页\t发布人:%s\t 赞:%s\n%s" %(page,story[0],story[2],text)
        
def get_all(pages):
    for i in range(1,pages):
        url = start_url + str(i)
        get_info(url,i)

get_all(3)

啊啊啊啊写了下来发现循环部分出现错误,就是每一页都得输出Q才行,得在每一页循环之前加上判断,那么继续更改以下函数,return用来跳出整个代码过程

def get_info(url,page):
    html = get_url(url)
    re_info = r'h2\>(.+?)\</h2\>.+?\<div class="content"\>(.+?)\</div\>.+?\<i class="number"\>(.+?)\</i'
    info_compile = re.compile(re_info,re.S)
    info = re.findall(info_compile,html)
    for story in info:
        input = raw_input()
        if input == 'Q':
            enable = False
            return
        re_text = re.compile('<br/>')
        text = re.sub(re_text,'',story[1])
        print u"第%d页\t发布人:%s\t 赞:%s\n%s" %(page,story[0],story[2],text)
        
def get_all(pages):
    print u'正在读取,回车查看,Q退出'
    enable =True
    for i in range(1,pages):
        if enable == True:
            url = start_url + str(i)
            get_info(url,i)
        return


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[Scrapy]爬取糗事百科段子

1.Python爬虫实战一之爬取糗事百科段子 (http://cuiqingcai.com/990.html) 2.在工作目录创建myprojectscrapy startproject mypr...
  • u014686875
  • u014686875
  • 2016-12-12 21:48
  • 565

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

1.抓取糗事百科热门段子 2.过滤带有图片的段子 3.实现每按一次回车显示一个段子发布人,段子内容 ———————————————————————————————————————————————...
  • jingza
  • jingza
  • 2016-10-09 10:35
  • 753

python爬虫----爬取糗事百科

一个练手的小爬虫 熟悉了下requests,BeautifulSoup,正则表达式的操作 本来不想放上来,因为感觉写的不好,放上来方便自己以后修改下 import requests fro...
  • qq_32511479
  • qq_32511479
  • 2017-07-13 14:00
  • 199

python 爬虫 爬取糗事百科段子

在网络上看到有介绍python爬虫爬去糗事百科段子的文章,觉得还挺好玩的,所以照着文章的思路自己重新实现了代码,完成了一个小小的爬虫爬取数据的例子。1.抓取页面的源码首先我们确定好页面的URL是 ht...
  • bitcarmanlee
  • bitcarmanlee
  • 2016-07-04 22:03
  • 3624

用urllib、BeautifulSoup抓取糗事百科段子

python版本为: chao@chao-machine:~/python_study$ python Python 3.4.3 (default, May 31 2015, 17:07:22) [...
  • shimachao
  • shimachao
  • 2015-07-24 18:13
  • 1761

Python3 定向爬虫之“抓取糗事百科图片”

#--*--coding:utf-8--*-- #抓取糗事百科图片,并保存到文件夹中import re import urllib.request from urllib.error import U...
  • qq_28766327
  • qq_28766327
  • 2016-03-30 22:23
  • 430

java爬虫糗百

继上次用java把糗百的源码下下来后,决定开始进行剥离想要的字段,不要求别的,只要能与之前用python写的程序实现相同的功能即可,糗百嘛,当然最重要的是段子,所以我只剥夺段子出来,不会乱杀无辜。这里...
  • qq_23660243
  • qq_23660243
  • 2016-01-07 14:43
  • 789

[Python 爬虫之路1] 爬取糗事百科(requests,bs4)

需要打开,收藏的网站: 糗事百科 bs4中文文档 requsts中文文档 # 目标: # 1.嗅事百科 24小时 中的段子 # 2.过滤有图的段子 # 4.每次点击回车则显示一条笑话...
  • qq_28057541
  • qq_28057541
  • 2017-02-13 21:44
  • 833

爬取糗事百科

目标:1、抓取糗事百科热门段子。2、过滤带有图片的端子。3、实现每按依次回车显示一个段子的发布时间,发布人,段子内容,点赞数。(这个网站不需要登陆,不需要用到cookie)1、确定URL抓取页面代码 ...
  • wyisfish
  • wyisfish
  • 2017-02-20 17:48
  • 120

爬取糗事百科

本次实战采取爬取糗事百科的段子 首先找到糗事百科的网址:http://www.qiushibaike.com/ 我们这次打算爬取文字模块。其网址部分是http://www....
  • cq340321
  • cq340321
  • 2017-02-13 16:33
  • 336
    个人资料
    • 访问:40104次
    • 积分:733
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:9篇
    • 译文:0篇
    • 评论:10条
    我的QQ
    963570357
    最新评论