python3爬虫(二)实战- 爬糗事百科-阿里云开发者社区

开发者社区> 墨持alvin> 正文

python3爬虫(二)实战- 爬糗事百科

简介: 2017-3-09 代码如下. 必须加上head否则无法抓取. # -*- coding:utf-8 -*- import urllib.
+关注继续查看

2017-3-09 代码如下.
必须加上head否则无法抓取.

# -*- coding:utf-8 -*-
import urllib.request
import urllib.error
import re
import time
page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
count=0
try:
    request = urllib.request.Request(url, headers = headers)
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    print(content)
    time.sleep(2)
    pattern =re.compile('<h2>(.*?)</h2>.*?<div class="content">.*?<span>(.*?)</span>.*?<div class="stats.*?class="number">(.*?)</i>', re.S)
    items = re.findall(pattern, content)

    for item in items:
        print("Author:"+item[0])
        print("Content:"+ item[1])
        print("favourite:"+ item[2])
        print("=====================")
except urllib.error.HTTPError as e:
    print(e.code)
except urllib.error.URLError as e:
    print(e.reason)
else:
    print("Executed!")

这里写图片描述

尽管核心部分已经完成了,但是还需要将代码更改为面向对象的形式。

import urllib.request
import re


class qsbkClassCrawler:
    # 初始化方法,定义一些变量
    def __init__(self):
        self.pageIndex = 1
        self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        # 初始化headers
        self.headers = {'User-Agent': self.user_agent}
        # 存放段子的变量,每一个元素是每一页的段子们
        self.stories = []
        # 存放程序是否继续运行的变量
        self.enable = False

        # 传入某一页的索引获得页面代码
    def getPage(self, pageIndex):
            try:
                url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
                # 构建请求的request
                request = urllib.request.Request(url, headers=self.headers)
                # 利用urlopen获取页面代码
                response = urllib.request.urlopen(request)
                # 将页面转化为UTF-8编码
                pageCode = response.read().decode('utf-8')
                return pageCode

            except urllib.request.URLError as e:
                if hasattr(e, "reason"):
                    print(u"连接糗事百科失败,错误原因", e.reason)
                    return None


    # 传入某一页代码,返回本页不带图片的段子列表
    def getPageItems(self, pageIndex):

        pageCode = self.getPage(pageIndex)
        if not pageCode:
            print("页面加载失败...")
            return None
        pattern = re.compile(
            '<h2>(.*?)</h2>.*?<div class="content">.*?<span>(.*?)</span>.*?<div class="stats.*?class="number">(.*?)</i>',
            re.S)
        items = re.findall(pattern, pageCode)
        pageStories=[]
        for item in items:
            pageStories.append([item[0].strip(),item[1].strip(), item[2].strip()])
        return pageStories

    # 加载并提取页面的内容,加入到列表中
    def loadPage(self):
        # 如果当前的页数少于两页,则加载新的一页
        if self.enable == True:
            if len(self.stories) < 2:
                #获取新的一页
                pageStories = self.getPageItems(self.pageIndex)
                # 将该页的段子存放到全局list中
                if pageStories:
                    self.stories.append(pageStories)
                    # 获取完之后页码索引加一,表示下次读取下一页
                    self.pageIndex += 1


    def getOneStory(self, pageStories, page):
        # 遍历一页的段子
        for story in pageStories:
            income = input('Please Input')
            # 每当输入回车一次,判断一下是否要加载新页面
            self.loadPage()
            if income == 'Q':
                self.enable = False
                return
            print("第%d页 作者%s 段子内容%s 点赞数%s" % (page,story[0],story[1],story[2]))

    def start(self):
        print("正在读取糗事百科,按回车查看新段子,Q退出")
        #使变量为true,程序可以正常运行
        self.enable=True
        #先加载一页内容
        self.loadPage()
        #局部变量,控制当前读了几页
        nowPage =0
        while self.enable:
            if len(self.stories) > 0:
                #从全局list中获取一页的段子
                pageStories= self.stories[0]
                #当前读到的页数加一
                nowPage +=1
                #将全局list中第一个元素删除,因为已经取出
                del self.stories[0]
                #输出该页的段子
                self.getOneStory(pageStories,nowPage)


if __name__ == "__main__":
    spider = qsbkClassCrawler()
    spider.start()

这里写图片描述

这是python爬虫的第一个实战,继续努力,小伙伴们共勉

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
知乎高颜值图片抓取到本地(Python3 爬虫.人脸检测.颜值检测)
本文代码有参考其他文章 原文链接:https://zhuanlan.zhihu.com/p/34425618
379 0
Python爬虫入门教程 51-100 Python3爬虫通过m3u8文件下载ts视频-Python爬虫6操作
什么是m3u8文件 M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。 原视频数据分割为很多个TS流,每个TS流的地址记录在m3u8文件列表中 比如我这里有一个m3u8文件...
1648 0
9、web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解
封装模块 #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from urllib import request import json import random import re import urllib.
2556 0
基于python的Scrapy爬虫框架实战
基于python的Scrapy爬虫框架实战 2018年7月19日笔记 1.伯乐在线 网站页面如下图所示: 网站页面.png 1.1 新建爬虫工程 命令:scrapy startproject BoleArticle 新建爬虫工程命令 命令:scrapy genspider article "blog.jobbole.com" 注意:运行此命令时必须在爬虫工程文件夹内,如下图路径所示。
1287 0
【资料下载】Python 第七讲——从实战中了解异步爬虫aiohttp的使用
直播时间:3月12日(周二)20:00——21:00 直播讲师 :陈祥安——阿里特邀技术专家 有着丰富的爬虫工作经验,从c#语言转入到python语言,擅长各种爬虫技术,熟悉大规模爬虫开发,热爱并喜欢钻研python。
1849 0
+关注
墨持alvin
架构,数据库相关专家
80
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载