一个爬去搜狐新闻标题的简单爬虫。

先看简短代码:

#!user/bin/python
# coding: utf-8

import urllib2
import re

#1.
def get_html(url):

    req = urllib2.urlopen(url)
    content = req.read()
    return content.decode('gbk').encode('utf-8')

#2.
def search_div(html):

    rp1 = re.compile(r'<div class="nav1">(.*?)</div>', re.S | re.I)
    m = re.search(rp1, html)
    n = m.group(1)
    print n
    list1 = []
    rp2 = re.compile(r'<a href=".*?">(.*?)</a>')
    for i in re.finditer(rp2, n):
        list1.append(i.group(1))

    return list1

#3.
def save_result(result):

    f = open('result.txt', 'w')
    for res in result:
        f.write(res+'\n')

    f.close()

url = 'http://www.sohu.com/'
html = get_html(url)
data = search_div(html)
save_result(data)











代码大致意思是先获取搜狐的html页面,利用正则抓取新闻的标签项,从抓取的标签项中在抓取标题,最后写入 .txt文档中。

代码总共定义了3个函数,功能如上所述。

get_html()函数用于获取搜狐的html页面。用到了urllib2模块,这是最简单的urllib2使用了,http是基于请求和应答机制的,客户端提出请求,服务器端提供应答。urllib2用一个Request对象来映射你提出的http请求,来创建一个Request对象,通过调用urlopen方法病传入Request对象,返回一个response对象,然后在response对象中调用read()方法,所以这个函数中还可以这样写: requset = urllib2.Request(url)   response = urllib2.urlopen(request)   content = response.read() 。最后返回的content就是html页面,这里涉及到一个转码的问题,python 默认的识别的编码是urf -8 ,搜狐网用的编码是 gbk,不可以直接转换,所以当两个不同编码之间转换时可以先将其中一个转换成unicode,继 而再转换成另一个,具体是 用decode('gbk') 将搜狐的html代码按照‘gbk‘ 编码的形式解码成unicode, 再按照’utf-8’的编码形式编码成’utf-8'


search_div()函数用于抓取匹配需要的代码。用到了re 正则处理的模块。r '  '里面是规则,就用到了个捕获组和最小匹配模式,re.compile方法主要是编译规则,这样可以使规则匹配的更快,这适用于经常要适用的规则,不常使用的规则也可不必编译直接使用。html页面中肯定有很多换行,re.S, re.I选项是使点可以匹配换行空格,且不区别大小写。下面的re.search()方法就是用于与对应的字符串进行匹配了,他返回的是match对象,他与findall的特别之处是 search()当匹配到一个的时候就不在匹配了,而findall会一直匹配下去(且返回的是列表),要想查看search返回的内容就需要调用group(),下面有一个规则,他是从上述抓取的html中匹配需要的标题,因为标题有很多个,所以这里search是不合适的,因为他匹配到第一个就会返回,进而匹配不到下面的标题,这里用到了finditer,他返回的也是match对象,但他是一个一个的把所有符合的都匹配,也可以用findall,但不能把返回的整个列表打印,这样的结果是列表中一串16进制数,只能一个一个的打印,这个函数返回的结果就是我们需要的标题了。


save_result() 就是用来把结果写入到文件的函数。





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值