用正则爬取糗事百科的段子


目标

1、爬取糗事百科的所有热门段子

2、将发帖人、段子内容、好笑数爬取下来

3、将图片过滤掉


过程

1、传入user_agent,介绍如下图


所以我们在写爬虫的时候可以加上去,可以解决一些禁止爬虫访问,返回不了源代码的问题

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = {'User-Agent': user_agent}  # 有的网站加了保护,需要设置Headers伪装成浏览器访问

2、在源代码中找到我们所需要爬取的信息,用正则爬取下来

红色的部分是我们需要爬取的,黄色的则是底下的图片,开始写正则。。

pattern = re.compile('<div class="author clearfix">.*?href.*?<img src.*?'
                             'title=.*?<h2>(.*?)</h2>.*?<div class="content">'
                             '(.*?)</div>.*?<div class="stats">.*?class="number">(.*?)</i>', re.S)
就按照源码中的一步一步来,重要的写出来,比如标签名,里面的内容.*?代替就行,需要的就加个()。


3、剩下的就是查看爬下来的内容是不是自己想要的,空格或者不需要的东西就想办法去掉。下面是完整版的代码

# encoding=utf-8
import urllib
import urllib2
import re
url = 'http://www.qiushibaike.com/8hr/page/'
for page in range(1, 11):  # 为了速度快点,只爬取了1——10页的段子
    url1 = url + str(page) + '/?s=4929284'
    # print url1    #检查网页是否正确
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = {'User-Agent': user_agent}  # 有的网站加了保护,需要设置Headers伪装成浏览器访问
    try:  # 用这种方式写代码,如果出现错误URLError,会反馈回错误代号,更容易判断程序在哪出错
        request = urllib2.Request(url1, headers=headers)
        response = urllib2.urlopen(request)  # 使代码更加规范,容易被理解,传入request
        content = response.read().decode('utf_8')
        pattern = re.compile('<div class="author clearfix">.*?href.*?<img src.*?'
                             'title=.*?<h2>(.*?)</h2>.*?<div class="content">'
                             '(.*?)</div>.*?<div class="stats">.*?class="number">(.*?)</i>', re.S)
        items = re.findall(pattern, content)
        for item in items:
            replaceBR = re.compile('<br/>')
            replaceSPAN = re.compile('<span>')
            replaceSPAN1 = re.compile('</span>')
            text = re.sub(replaceBR, "", item[1])
            text1 = re.sub(replaceSPAN, "", text)
            text2 = re.sub(replaceSPAN1, "", text1)  # 去掉多余的字符
            # print '-->',text2,'--<'      #查看空格回车是在哪个分组里
            text3 = text2.encode('utf-8').strip().replace('<span class="contentForAll">查看全文', '')
            # 检查到了一行‘<span class="contentForAll">查看全文’,去掉它
            item0 = item[0].encode('utf-8')
            item2 = item[2].encode('utf-8')  # 编码成utf-8格式,便于写入文件
            # print text2
            with open('qiubai3.txt', 'a+') as QB:
                # 用读写追加的方式打开文件,使用w或w+ 因为for循环的遍历,只会出来最后一行数据,会覆盖掉
                QB.write(item0 + '|' + text3 + '|' + item2 + '\n')
    except urllib2.URLError, e:
        if hasattr(e, "code"):
            print e.code
        if hasattr(e, "reason"):
            print e.reason




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值