[iuud8]新手使用python实现爬虫的初始记录

就在两个小时前,我对于python还是一个除了名字一无所知的人。因为以前在论坛还有工作中多次见识到它的强大,因此决定对它开始学习。经过网上相关的搜索:发现大部分人貌似都是通过编写一个爬虫程序来熟悉学习的,正好是这么有趣的东西,我也打算这么先把python大致的了解一下,然后再慢慢的熟悉深挖!!

纪念我的第一个python程序:

#!/usr/bin/python

def func():
    print 'Hello Python'

func()

***********************分割线*******************************

我用的是MBP,自带python,自带python版本为2.7.10.

抓取网页

在python中,使用组件urllib2来抓取网页。如下:
import urllib2

url = urllib2.Request('http://cn.bing.com')
response = urllib2.urlopen(url)
html = response.read()

print html
在终端运行可以看到

此时打开火狐浏览器(safari似乎没法看),进入http://cn.bing.com右键查看页面源代码,能看到两边是一样的内容

读取到以后,尝试把读取到的数据保存到本地文件中:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib2
import string

url = urllib2.Request('http://cn.bing.com')
response = urllib2.urlopen(url)
html = response.read()

f = open('html.txt','w+')
f.write(html)
f.close()


 
这样,就能把获取到的页面源代码保存到与python相同目录下一个叫 html.txt 的文本文件中。 

注1:有些时候,一些网站并不允许爬虫来访问自己的网站,因此需要给程序做一些伪装,来使网站认为这就是浏览器发出的请求

注2:通常情况下,我们只需要爬我们需要的数据就好了,这么多杂乱的代码看起来很不清晰,因此就需要做一个筛选筛选通常可以根据查看源码发现自己需要的数据对应的字段,然后使用lambda表达式来筛选出需要的数据。

注3:python不像C++一样使用大括号来对代码分段,它的分段就是要就是看缩进,因此一定要注意!!!

实现一个爬下来糗百段子的程序功能:

会把糗百的数据爬下来,并自动截取其中的段子保存到本地文件中

#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib2
import string
import re
import thread
import time
import codecs

class SpiderModel:

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

    #将所有的段子都扣出来,添加到列表中并返回列表
    def GetPage(self,page):
        print 'Start GetPage'
        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()
        #encode的作用是将unicode编码转换成其他编码的字符串
        #decode的作用是将其他编码的字符串转换成unicode编码
        unicodePage = myPage.decode("utf-8")
        myItems = re.findall('<div.*?class="content">(.*?)</div>',unicodePage,re.S)
        items = []
        
        for item in myItems:
            items.append(item)
        
        return items

    def LoadPage(self):
        print 'Start LoadPage'
        while self.enable:
            if len(self.pages) < 10:
                try:
                    myPage = self.GetPage(str(self.page))
                    self.page += 1
                    self.pages.append(myPage)

                except:
                    print '无法链接糗事百科'
            else:
                self.enable = False
                break;

    def SavePage(self,nowPage,page):
        sName = string.zfill(page,5)+'.txt'
        f = codecs.open(sName,'w+', encoding='utf-8')
        for item in nowPage:
            print item
            f.write(item)
        f.close()


    def Start(self):
        self.enable = True
        page = self.page

        print u'正在加载中请稍候。。。'

        thread.start_new_thread(self.LoadPage,())

        while self.enable:
            if self.pages:
                nowPage = self.pages[0]
                del self.pages[0]
                self.SavePage(nowPage,page)
                page += 1


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

这段代码是仿网上写的,链接是:http://blog.csdn.net/pleasecallmewhy/article/details/8932310

我在他的基础上改了两点:第一个是筛选的时候

myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)  
因为现在糗百的字段发生变化,我改为了

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

第二个是他是直接输出到控制台,我输出在了以page命名的txt中。


注意的坑:

1.header,这个具体怎么获取还没搞清楚,但是是伪装成浏览器请求的关键

2.编码转换,同样具体待研究

3.在写入文件的时候,本来是这么写的

f = codecs.open(sName,'w+')
此时在for循环中,输出item是正常的,但是在写入文件的时候,会给以下的错误

Traceback (most recent call last):
  File "./qiuBai1.py", line 83, in <module>
    myModel.Start()
  File "./qiuBai1.py", line 76, in Start
    self.SavePage(nowPage,page)
  File "./qiuBai1.py", line 60, in SavePage
    f.write(item)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-33: ordinal not in range(128)
即获取到的item格式正常,但是写入的时候格式发生错误,网上这么解释的:

1.当你把字符串写到文件中去时,因为你的字符串是 unicode,所以Python会(自动)先调用encode方法来编码unicode字符串,然后再写入文件

2.当调用encode方法时,因为没有指定编码格式,所以采用默认值 ascii,ascii并不能解释 1 中翻译的字符码,所以报错

解决方案也有两个:

  • 把unicde格式的字符串转换成utf-8,此时在写入文件不会时,不会自动调用encode方法
  • 调用 codecs 模块的 open 方法,并指定文件的编码格式

我这里采用的就是第二个:

引入codecs

import codecs
手动指定文件编码格式

f = codecs.open(sName,'w+', encoding='utf-8')
问题解决!!!!

以上。。。。接下来就可以沿着其中的坑来进行python学习了

基本语法,关键字,运算符,正则表达式(lambda),编码等等。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值