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

目录
相关文章
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
1237 7
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
1555 62
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
数据采集 机器学习/深度学习 人工智能
反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
本文系统阐述了反爬虫技术的演进与实践,涵盖基础IP限制、User-Agent检测,到验证码、行为分析及AI智能识别等多层防御体系,结合代码实例与架构图,全面解析爬虫攻防博弈,并展望智能化、合规化的发展趋势。
3414 62
反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
784 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
2127 1
Python API接口实战指南:从入门到精通
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
320 12
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
1260 19
|
数据采集 人工智能 JSON
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码

推荐镜像

更多