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爬虫的第一个实战,继续努力,小伙伴们共勉

目录
相关文章
|
5天前
|
数据采集 数据挖掘 Python
Python:pandas做爬虫
Python:pandas做爬虫
18 0
|
7天前
|
数据采集
爬虫 正则 之 爬取糗事百科的照片
爬虫 正则 之 爬取糗事百科的照片
|
2天前
|
调度 开发者 UED
探索Python中的异步编程:从基础到实战
【9月更文挑战第30天】在编程的世界里,异步编程是一个强大的概念,它允许程序在等待某些操作完成时继续执行其他任务。本文将深入探讨Python中的异步编程,从理解其基本概念开始,逐步过渡到高级应用。我们将通过具体的代码示例来展示如何在实际项目中实现异步功能,从而提高应用程序的性能和响应性。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
3天前
|
数据采集 存储 XML
构建高效的Python爬虫系统
【9月更文挑战第30天】在数据驱动的时代,掌握如何快速高效地获取网络信息变得至关重要。本文将引导读者了解如何构建一个高效的Python爬虫系统,从基础概念出发,逐步深入到高级技巧和最佳实践。我们将探索如何使用Python的强大库如BeautifulSoup和Scrapy,以及如何应对反爬措施和提升爬取效率的策略。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在信息收集的海洋中航行得更远、更深。
15 6
|
1天前
|
数据采集 数据挖掘 数据处理
Python中实现简单爬虫并处理数据
【9月更文挑战第31天】本文将引导读者理解如何通过Python创建一个简单的网络爬虫,并展示如何处理爬取的数据。我们将讨论爬虫的基本原理、使用requests和BeautifulSoup库进行网页抓取的方法,以及如何使用pandas对数据进行清洗和分析。文章旨在为初学者提供一个易于理解的实践指南,帮助他们快速掌握网络数据抓取的基本技能。
11 3
|
6天前
|
数据采集 人工智能 程序员
探索Python编程:从基础到实战
【9月更文挑战第27天】在这篇文章中,我们将一起踏上一段激动人心的Python编程之旅。无论你是初学者还是有一定经验的开发者,这里都有适合你的内容。文章将通过浅显易懂的语言带你了解Python的基础语法,并通过实际案例展示如何将这些知识应用于解决现实问题。准备好,我们即将启程!
|
5天前
|
数据采集 Python
天天基金数据的Python爬虫
天天基金数据的Python爬虫
20 3
|
7天前
|
存储 人工智能 数据挖掘
Python编程入门:从基础到实战
【9月更文挑战第26天】 在这篇文章中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从Python的基本语法开始,然后逐步深入到更复杂的主题,如函数、类和模块。最后,我们将通过一个实际的项目来应用我们所学的知识。让我们一起开始这段Python编程之旅吧!
|
7天前
|
数据采集 人工智能 数据挖掘
Python编程入门:从基础到实战的快速指南
【9月更文挑战第25天】本文旨在为初学者提供一个简明扼要的Python编程入门指南。通过介绍Python的基本概念、语法规则以及实际案例分析,帮助读者迅速掌握Python编程的核心技能。文章将避免使用复杂的专业术语,而是采用通俗易懂的语言和直观的例子来阐述概念,确保内容的可读性和实用性。
|
5天前
|
数据采集 JSON 数据格式
Python:南京地铁每日客流数据的爬虫实现
Python:南京地铁每日客流数据的爬虫实现
15 1
下一篇
无影云桌面