码迷,mamicode.com
首页 > 编程语言 > 详细

python实现简单爬虫(二)---- 使用urllib等python模块

时间:2014-07-22 22:47:35      阅读:347      评论:0      收藏:0      [点我收藏+]

标签:des   cWeb   style   blog   http   java   

  之前使用scrapy实现了一个超级简单的爬虫工具,用于抓取豆瓣上面所有的编程书籍信息(由于不需要爬取整个页面的所以链接,所以不需要用到BFS or DFS,只实现顺序抓取下一页)

  这次使用的是python自带的urllib 和urllib2等python模块实现,同样以豆瓣上面的爱情电影信息作为爬取对象,方法与过程其实如出一辙,同样是对每一个页面发出请求后获取响应得到的网页源码,再使用正则表达式去匹配获得所需信息,然后获取下一页的链接继续爬取。

  爬取页面:

  bubuko.com,布布扣

  网页源码:

  title and link:   bubuko.com,布布扣

  desc:      bubuko.com,布布扣

 

      确定要要抓取的页面和信息后,就可以开始写代码啦~用一个类来执行工作,最后将爬取信息存放到movie.json 文件中,代码如下:

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import json


class FilmSpider:
    def __init__(self, init_url_):
        self.start_url = init_url_
        self.contain = []
        self.curPage = 1

    def Parse(self):
        nexturl = self.start_url
        while nexturl != None:
            nexturl = self.parsePage(nexturl)
            self.curPage += 1

        f = open(movie2.json, a)

        # JsonLinesItemExporter
        """
        for each_item in self.contain:
            tar = json.dumps(each_item, ensure_ascii=False)
            f.write(tar+‘\n‘)
        """
        # JsonItemExporter
        first_item = True
        f.write([)
        for each_item in self.contain:
            if first_item:
                first_item = False
            else:
                f.write(,\n)
            tar = json.dumps(each_item, ensure_ascii=False)
            f.write(tar)
        f.write(])
        f.close()

    def parsePage(self, cururl):
        print(sola is scrawling the %d page: %self.curPage + cururl)
        response = urllib2.urlopen(cururl)
        body = response.read()
        #返回所有在<tr class="item"></tr>中的字符串的list
        myItems = re.findall(<tr class="item">(.*?)</tr>, body, re.S)
        for item in myItems:
            # 返回所有title 和link组成的tuple所组成的list, 其实list中只有一个tuple
            info = re.findall(<a.*?class="nbg".*?href="(.*?)".*?title="(.*?)">, item, re.S)
            # 返回<p>内的描述所构成的list, 同理只有一个元素
            desc = re.findall(<p.*?class="pl">(.*?)</p>, item, re.S)
            #newItem =  Item(info[0][0], info[0][1], desc[0])

            newItem = {}
            newItem[link] = info[0][0]
            newItem[title] = info[0][1]
            newItem[desc] = desc[0]
            self.contain.append(newItem)
            print newItem[title]
            print newItem[link]
            print newItem[desc]
            print (\n\n------------------------------------------------------------------------------------------------\n\n)

        Next = re.findall(<span.*?class="next">.*?<link.*?rel="next".*?href="(.*?)"/>, body, re.S)
        if Next:
            return Next[0]
        return None



#-------------------------Main--------------------
#program: spider for Love in Douban
#author : Patrick
#-------------------------------------------------

print(-----------------Start crawl----------------------)

initurl = http://movie.douban.com/tag/%E7%88%B1%E6%83%85?start=0&type=T
solaSpider = FilmSpider(initurl)
solaSpider.Parse()

print(-----------------End crawl------------------------)

 

  代码中关于json文件的存储由两种方式,对应于scrapy框架中的两种存储方式(JsonLinesItemExporter 和 JsonItemExporter 都继承于BaseItemExporter):

  1. JsonLinesItemExporter: 也就是将每一个item转换成json格式后写入,对应与Scrapy中的代码如下:

  bubuko.com,布布扣

  

  2. JsonItemExporter: 将所有转换成json格式的item再统一放进一个list里面,对应scrapy代码如下:

  bubuko.com,布布扣

 

  好啦,得到的movie.json 就是酱:

  bubuko.com,布布扣

 

 

 

 

  

python实现简单爬虫(二)---- 使用urllib等python模块,布布扣,bubuko.com

python实现简单爬虫(二)---- 使用urllib等python模块

标签:des   cWeb   style   blog   http   java   

原文地址:http://www.cnblogs.com/Patrickcxt/p/3859593.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!