C程序员一周入门python(二)

本来想先看完书《Web Scraping with Python》再去实践的,后来偷懒,直接到github上找了一个高票项目。然后在分析部分(因为要满足一周的要求。。。)这个项目的基础上,结束python入门。

原项目使用MIT许可证,我就放心大胆的用了。项目地址:https://github.com/nladuo/taobao_bra_crawler

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

import json
import sys
sys.path.append("../")
from lib.model import *
from lib.utils import *
from lib.config import *

reload(sys)
sys.setdefaultencoding('utf8')


class ItemCrawler:
    """ 爬取淘宝文胸商品记录 """

    def __init__(self):
        self.client = init_client()
        self.db = self.client[config['db_name']]
        self.collection = self.db.items

    def run(self):
        urls = []
        for i in range(1, 100 + 1):
            urls.append("http://s.m.taobao.com/search?q=文胸&m=api4h5&page=" + str(i))
            urls.append("http://s.m.taobao.com/search?q=胸罩&m=api4h5&page=" + str(i))
            urls.append("http://s.m.taobao.com/search?q=bra&m=api4h5&page=" + str(i))

        for url in urls:
            print url
            body = get_body(url)
            if len(body) == 0:
                continue
            items = self.__parse(body)
            self.__add_items(items)

        self.__close()

    def __parse(self, body):
        """ 解析商品记录 """
        items = []
        try:
            data = json.loads(body)
        except:
            return []
        item_list = data['listItem']
        if len(item_list) == 0:
            return []
        for _item in item_list:
            item = Item(_item['item_id'], _item['userId'], _item['title'], False)
            items.append(item)
        return items

    def __add_items(self, items):
        """ 添加商品记录到数据库 """
        for item in items:
            if self.collection.find({'item_id': item.item_id}).count() == 0:
                self.collection.insert(item.dict())

    def __close(self):
        """ 关闭数据库 """
        self.client.close()


if __name__ == '__main__':
    crawler = ItemCrawler()
    crawler.run()

程序功能是抓取手淘前100页的以文胸/胸罩/bra为关键词的信息(共300页)。但是文中的URL返回的是JSON数据包这个令我很惊讶。不知道这个URL是怎么得出来的。。。

言归正传,这里分析一下一个C程序员在看到这段代码时的疑惑。
这个程序通过“python item_crawler.py”运行,这样运行的时候,或者也可以像执行shell脚本那样执行这个python脚本,执行的时候,python解释器将当前模块的__name__设置为__main__而这个模块import其它模块的时候__name__是模块名,__main__是每个模块都有的一个全局变量名(namespace仅限模块)。
所以上述代码从if开始执行
然后实例化一个ItemCrawler,这个时候会自动调用__init__函数,这个函数初始化mongdb数据库,而且我们还注意到类的每个函数都含有一个self参数。最后crawler调用方法run。然后依次做URL的生成和抓取,并对返回的JSON数据包进行分析,并把采集的数据存储到mongodb。

好了,这样也算基本入门了,python语言层面虽然简单,但提供了很有用的功能,要结合具体项目去学习python的使用。

猜你喜欢

转载自blog.csdn.net/xtydtc/article/details/76055650