Python 爬虫学习2

这是小白学习笔记....大神勿喷。

本次学习糗事百科的网络爬虫。

http://blog.csdn.net/pleasecallmewhy/article/details/8932310

因为那个糗事百科网页改版了,content类中已经没有title...所以源码也有所改动。

所以找到一个改进版的

http://blog.csdn.net/u011350541/article/details/52264073

感谢以上作者的无私分享。

改进源码:

# -*- coding: utf-8 -*-      

import urllib2
import urllib
import re
import thread
import time
import json  

#----------- 加载处理糗事百科 -----------
class Spider_Model:      

    def __init__(self):
        self.page = 1
        self.pages = []
        self.enable = False      

    # 将所有的段子都扣出来,添加到列表中并且返回列表
    def GetPage(self,page):
        myUrl = "http://m.qiushibaike.com/hot/page/" + page
        user_agent = ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘
        headers = { ‘User-Agent‘ : user_agent }
        req = urllib2.Request(myUrl, headers = headers)
        myResponse = urllib2.urlopen(req)
        myPage = myResponse.read()
        # print myPage
        unicodePage = myPage.decode("utf-8")
        # 找出所有class="content"的div标记
        #re.S是任意匹配模式,也就是.可以匹配换行符
        myItems = re.findall(‘<div.*?class="content">(.*?)</div>‘,unicodePage,re.S)
        items = []
        # print myItems
        # print str(myItems).decode(‘string_escape‘)
        # print json.dumps(myItems, encoding="UTF-8", ensure_ascii=False)
        # for item in myItems:
        #     # item 中第一个是div的标题,也就是时间
        #     # item 中第二个是div的内容,也就是内容
        #     items.append([item[0].replace("\n",""),item[1].replace("\n","")])
        # print myItems
        # print str(myItems).decode(‘string_escape‘)
        # print str(myItems).encode("UTF-8")
        # print myItems[0]
        return myItems  

    # 用于加载新的段子
    def LoadPage(self):
        # 如果用户未输入quit则一直运行
        while self.enable:
            # 如果pages数组中的内容小于2个
            # print len(self.pages)
            if len(self.pages) < 2:
                try:
                    # 获取新的页面中的段子们
                    myPage = self.GetPage(str(self.page))
                    self.page += 1
                    self.pages.append(myPage)
                except:
                    print ‘无法链接糗事百科!‘
            else:
                time.sleep(5)  

    # def ShowPage(self,nowPage,page):
    #     print u‘第%d页‘ % page,json.dumps(nowPage, encoding="UTF-8", ensure_ascii=False)  

    def ShowPage(self,nowPage,page):
        i = 0
        # print len(nowPage)
        for i in range(0,len(nowPage)):
            if i < len(nowPage):
                print u‘第%d页,第%d个故事‘ %(page,i) ,nowPage[i].replace("\n\n","")
                i += 1
            else:
                break  

    def Start(self):
        self.enable = True
        page = self.page
        print u‘正在加载中请稍候......‘
        # 新建一个线程在后台加载段子并存储
        thread.start_new_thread(self.LoadPage,())
        #----------- 加载处理糗事百科 -----------
        while self.enable:
            # 如果self的page数组中存有元素
            if self.pages:
                nowPage = self.pages[0]
                del self.pages[0]
                self.ShowPage(nowPage,page)
                page += 1      

#----------- 程序的入口处 -----------
print u"""
---------------------------------------
   程序:糗百爬虫
   版本:0.3
   作者:why
   日期:2014-06-03
   语言:Python 2.7
   操作:输入quit退出阅读糗事百科
   功能:按下回车依次浏览今日的糗百热点
---------------------------------------
"""    

print u‘请按下回车浏览今日的糗百内容:‘
raw_input(‘ ‘)
myModel = Spider_Model()
myModel.Start()

  

这个源码是可以跑的,但是我跑有点问题。

会出现乱码。

接下来学习并尝试找出原因。

////////////////////////////////////////////////////////////////////////////////////////////

#重新跑了几次后

再跑就不会出现乱码了....好奇怪

但出现了

UnicodeEncodeError: ‘gbk‘ codec can‘t encode character u‘\u22ef‘ in position 13: illegal multibyte sequence
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr

对于这种错误,查了一下,发现

http://www.crifan.com/unicodeencodeerror_gbk_codec_can_not_encode_character_in_position_illegal_multibyte_sequence/

这个帖子讲得很详细。

PS:编码知识

再贴一个讲计算机编码的知乎帖子~

https://www.zhihu.com/question/23374078

讲python编码的帖子

http://lukejin.iteye.com/blog/598303

简而言之:

unicode是信源编码,对字符集数字化;

utf8是信道编码,为更好的存储和传输。

////////////////////////////////////////////////////////////////////////////////////////////

又跑了几次,又出现乱码....

我一步步进行调试,可是却是可以正常运行的,每一页都可以显示出来。

但是跑起来却是正常显示几页后,就乱码了。

不知道为什么....

///////////////////////////////////////////////////////////////////////////////////////////

1.正则表达式

不展开学习,一次性看完会有点乱。

就说一下这个源码里面的。

因为要找出百科里面的段子,所以看了一下网页的html源代码。是这样的。

所以我们就要找<div class = "content">....</div>中间的东西。

就要用到re.findall()

用法:re.findall(pattern, string[, flags]):  返回列表。

举个栗子,eg:

relink为搜索条件

info为搜索目标

然后本次源码如下:

myItems = re.findall(‘<div.*?class="content">(.*?)</div>‘,unicodePage,re.S)

意思就是:

在unicodePage中用‘<div.*?class="content">(.*?)</div>‘这个正则表达式来搜索一切

匹配我们的条件<div class = "content">....</div>的部分,并把搜索结果放进myItems列表中。

2.print的问题

主要针对这条

print u‘第%d页,第%d个故事‘ %(page,i) ,nowPage[i].replace("\n\n","")

%d为占位符,就是先占着一个位置,后面再填充回去。

填充内容就在后面的()里面,就是%d对应page,第二个%d对应 i 。

然后接着输出nowPage[i].replace("\n\n","")

.replace()表示将nowPage[i]里的两个换行符"\n\n"替换成没有东西" "。

这样做的原因是 每行可以显示一则段子。

/////////////////////////////////////////////////////////////////////////////////////

经过调试

大致了解整个源码怎么运行...

后台有一个加载网页的线程LoadPage(),用len(self.pages)是否大于2来进行判断是否加载存储网页,每次只加载一个网页,就是20个段子。

主进程则是显示网页的作用,把第一次加载下来的网页放进列表nowpage里,然后删除self.pages,使它的长度len(self.pages)又回复到1。

接着,后面的线程又可以进行第二次加载,然后在cmd显示出第一次加载的网页段子。

				
时间: 2024-08-25 08:24:30

Python 爬虫学习2的相关文章

Python爬虫学习系列教程

Python爬虫学习系列教程 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. Python版本:2.7 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库

Python爬虫学习:四、headers和data的获取

之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.com/ 打开网页,按下F12键,如下图所示: 点击下方标签中的Network,如下: 之后再点击下图所示位置: 找到红色下划线位置所示的标签并点击,在右边的显示内容中可以查看到所需要的headers信息. 一般只需要添加User-Agent这一信息就足够了,headers同样也是字典类型: user

Python爬虫学习:三、爬虫的基本操作流程

本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将数据或信息存入数据库中: 3.数据展示,即在Web端进行显示,并有自己的分析说明. 这次我先介绍第一个功能中所需要实现的基本操作: 爬虫的基本操作:      表示必须步骤           表示可选步骤 导入爬虫所需要的库(如:urllib.urllib2.BeautifulSoup.Scrap

2018/7/21 Python 爬虫学习

2018/7/21,这几天整理出来的一些Python 爬虫学习代码. import urllib2 response = urllib2.urlopen("http://baidu.com") html = response.read() print html 进一步,可以request import urllib2 req = urllib2.Request("http://www.baidu.com") response = urllib2.urlopen(re

Python爬虫学习路线,强烈建议收藏这十一条

(一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量.数据结构.语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Python 简介 | 菜鸟教程 2.看完基础后,就是做一些小项目巩固基础,比方说:做一个终端计算器,如果实在找不到什么练手项目,可以在 Codecademy - learn to code, interactively, for free 上面进行练习. 如果时间充裕的

开始我的Python爬虫学习之路

因为工作需要经常收集一些数据,我就想通过学爬虫来实现自动化完成比较重复的任务. 目前我Python的状况,跟着敲了几个教程,也算是懂点基础,具体比较深入的知识,是打算从做项目中慢慢去了解学习. 我是觉得如果一开始就钻细节的话,是很容易受到打击而放弃的,做点小项目让自己获得点成就感路才更容易更有信心走下去. 反正遇到不懂的就多查多问就对了. 知乎上看了很多关于入门Python爬虫的问答,给自己总结出了大概的学习方向. 基础: HTML&CSS,JOSN,HTTP协议(这些要了解,不太需要精通) R

Python实战:Python爬虫学习教程,获取电影排行榜

Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本文是在前一部分Python基础之上程序员带你十天快速入门Python,玩转电脑软件开发(四),再次进行的Python爬虫实战课程. 正则表达式实例简单详解 正则表达式干什么用? 就是在字符串中提取我们需要的内容的. 记得哦,要先引用正则表达式模块的哦. re就是正则表达式相

《Python爬虫学习系列教程》学习笔记

转自:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. 一.Python入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫

Python爬虫学习一之Requests包使用方法

Requests函数库是学习Python爬虫必备之一, 能够帮助我们方便地爬取. 本文主要参考了其官方文档. Requests安装: requests目前的版本是v2.11.1, 在WINDOWS上可以通过命令行窗口(运行cmd命令), 利用pip进行自动地安装(很方便): > pip install requestsCollecting requests Downloading requests-2.11.1-py2.py3-none-any.whl <514kB>Installing

Python爬虫学习(1)

接触python不久,也在慕课网学习了一些python相关基础,对于爬虫初步认为是依靠一系列正则获取目标内容数据 于是参照着慕课网上的教学视频,完成了我的第一个python爬虫,鸡冻 >_< # !/usr/bin/env python # -*- coding: UTF-8 -*- # addUser: Gao # addTime: 2018-01-27 23:06 # description: python爬虫练习 import urllib2, re, os # 获取目标网址 Targe