文档章节

抓取搜狐汽车的汽车信息

tavenpy
 tavenpy
发布于 2015/02/05 14:17
字数 736
阅读 7
收藏 0

# coding=utf-8

__author__ = 'taven'

from blog.models import CarBrand, CarCategory, CarType
from pyquery import PyQuery as pyq
import chardet
import requests
import sys
reload(sys)
import urllib
sys.setdefaultencoding("utf-8")

# pyq相当于jquery中的$
base_url = r'http://db.auto.sohu.com/'
res = requests.get(base_url).content
html = pyq(res)

car_category_list = html('.con .category_main')
category_url_json = {}


#判断字符是否为空或特殊字符
def isblank(ch):

    if ch == u'\x20' or ch <= u'\x1f' or ch == u'\x7f' or ch == u'\xA0':
        return True

    return False


def func_model(model_string):
    try:
        encoding_dict = chardet.detect(model_string)
        if encoding_dict['encoding'] != 'unicode' and \
                        encoding_dict['encoding'] != 'UNICODE':
            model_string = unicode(model_string, encoding_dict['encoding'])
    finally:
        start_with = 0
        end_with = len(model_string)

        for idx, ch in enumerate(model_string):
            if isblank(ch):
                start_with = idx + 1
                break

        for idx, ch in enumerate(model_string[start_with:end_with]):
            if ch >= u'\u4e00' or ch == u'(':
                end_with = start_with + idx
                break

        return model_string[start_with:end_with]


for index, car_category in enumerate(car_category_list):
    car_category_html = pyq(car_category)
    car_brand_html = car_category_html.find('.meta_left p')
    car_logo_html = car_category_html.find('.meta_left a img')
    urllib.urlretrieve(pyq(car_logo_html).attr('data-original'),
                       '/home/taven/tblog/car_logo/'+'logo%s' %index)
    # car_brand = CarBrand(name=str(pyq(car_brand_html).text()).decode('utf8'),)
    # car_brand.save()
    print '\n'
    print '\n'
    print '车品牌:::::::::::::::'+pyq(car_brand_html).text()
    car_category_html_dt_list = car_category_html.\
        find('dt span:first-child span a')
    for car_category_html_dt in car_category_html_dt_list:
        print "车系:::::::::::::::"+pyq(car_category_html_dt).text()

        car_category_item = pyq(car_category_html_dt).parent().next().text()
        # car_brand = CarBrand.objects.get(name=pyq(car_brand_html).text())
        # car_type = CarType(name=pyq(car_category_html_dt).text(),
        #                    car_brand_id=car_brand.id)
        # car_type.save()

        # print "车系href:::::::::::::::"+pyq(car_category_html_dt).attr('href')
        category_url = r'http://db.auto.sohu.com'\
                       +pyq(car_category_html_dt).attr('href')

        category_url_list = []
        category_url_list.append(category_url)

        # $(".stop_sell h4 a").each(function(){alert(this)});
        i = 2001
        while i <= 2015:
            f = urllib.urlopen('http://db.auto.sohu.com'
                               +pyq(car_category_html_dt).attr('href')
                               +'year'+str(i)+'.shtml')
            if f.geturl() != 'http://db.auto.sohu.com/index.shtml':
                category_url_list.append(
                    r'http://db.auto.sohu.com'
                    +pyq(car_category_html_dt).attr('href')
                    +'year'+str(i)+'.shtml'
                )
            i += 1
        car_category_name_list = []
        for category_url in category_url_list:
            print '\n'
            print category_url
            res_car_category = requests.get(category_url).content
            if res_car_category is not None and len(res_car_category) > 10000:
                car_category_html = pyq(res_car_category)
                car_category_a_list = car_category_html('.b .ftdleft')
                for car_category_a in car_category_a_list:
                    car_category_name = pyq(car_category_a).find("a:first").text()
                    handled_category_name = func_model(car_category_name)
                    if handled_category_name not in car_category_name_list:
                        car_category_name_list.append(handled_category_name)
                        print handled_category_name
                        # car_category = CarCategory(name=handled_category_name,
                        #                            car_type_id=car_type.id)
                        # car_category.save()

print 'ok'

# 测试数据
if __name__ == '__main__':
    print func_model('2011款 1.4T Urban版')
    print func_model('2013款 40 TFSI 进取型')
    print func_model('2011款 1.4T Ego plus版')  # 这种不能处理
    print func_model('2002款 1.8i手动5速')  # 这种不能处理
    print func_model('2009款 2.0TFSI 豪华型')
    print func_model('2012款 1.8TFSI MT舒适型')
    print func_model('2010款 2.0TFSI 标准型')
    print func_model('2014款 35 TFSI 进取型')
    print func_model('2012款 40TFSI 越野型')
    print func_model('2014款 35 TFSI 进取型')
    print func_model('2013款 40 TFSI quattro运动型')
    print func_model('2001款 1.8T手动5速基本型')
    print func_model('2003款 2.4i手动5速')
    print func_model('2003款 2.8i 无级手动一体技术领先型')
    print func_model('2005款 2.0T FSI®手动标准型')
    print func_model('2006款 L 07款 3.1 FSI 无级/手动一体')
    print func_model('2007款 2.8 FSI 尊享型')
    print func_model('2008款 2.4 技术型')
    print func_model('2008款 3.2FSI quattro 豪华型')
    print func_model('2010款 2.4L 豪华型')
    print func_model('2011款 2.7TDI 舒适型')
    print func_model('2012款 35 FSI quattro 豪华型(2.8L)')
    print func_model('2015款 40 TFSI quattro 豪华型')


# 相关的model
class CarBrand(models.Model):
    name = models.CharField(max_length=30)  # 品牌名
    company_id = models.IntegerField(default=0)
    create_by = models.IntegerField(default=0)
    create_date = models.DateTimeField(auto_now=True)
    update_by = models.IntegerField(default=0)
    update_date = models.DateTimeField(auto_now=True)
    del_flag = models.BooleanField(default=False)

    class Meta:
        db_table = 'car_brand'


class CarType(models.Model):
    name = models.CharField(max_length=30)  # 车系名
    company_id = models.IntegerField(default=0)
    car_brand = models.ForeignKey(CarBrand)
    create_by = models.IntegerField(default=0)
    create_date = models.DateTimeField(auto_now=True)
    update_by = models.IntegerField(default=0)
    update_date = models.DateTimeField(auto_now=True)
    del_flag = models.BooleanField(default=False)

    class Meta:
        db_table = 'car_type'


class CarCategory(models.Model):
    name = models.CharField(max_length=30)  # 车类别名
    company_id = models.IntegerField(default=0)
    car_type = models.ForeignKey(CarType)
    create_by = models.IntegerField(default=0)
    create_date = models.DateTimeField(auto_now=True)
    update_by = models.IntegerField(default=0)
    update_date = models.DateTimeField(auto_now=True)
    del_flag = models.BooleanField(default=False)

    class Meta:
        db_table = 'car_category'

© 著作权归作者所有

共有 人打赏支持
tavenpy
粉丝 6
博文 91
码字总数 11490
作品 0
青岛
存储数据及下载图片怎么办

@黄亿华 你好,想跟你请教个问题:我在做汽车信息的抓取,请问图片怎么办 是自己下载还是通过webmagic的组件完成?另外我想要把数据存进数据库有没有很简便的方法,还有就是定时抓取 存数据的...

神神的棍子
2014/06/20
329
3
我买了一辆奥迪,然后……

鸣谢:写作过程中给予帮助的 @张然 、 @奥迪 背后的男人 当然我没买奥迪,这是一篇对奥迪的人群画像、以及其在知乎发展的可能性探索。 对汽车话题可谓是觊觎已久了,最近在研究车,打算买车了...

路人甲
2017/08/25
0
0
平安金融壹账通携手福田汽车发布“福金All-Link系统” 区块链+汽车供应链金融能走多远?

雷锋网(公众号:雷锋网)消息,8月10日,由平安金融壹账通与福田汽车集团福田金融共同打造的“福金ALL-Link系统”在北京正式发布。该系统是区块链技术在汽车供应链金融领域的首次应用,借助区...

Fank
08/12
0
0
hibernate 框架学习笔记

一、框架引入 1.创建项目。 2.下载官方jar包。hibernate-distribution-3.5.6-Final 3.导入需要的包。 D:jarhibernatehibernate-distribution-3.5.6-Finalhibernate3.jarD:jarhibernatehibern......

六月晨光
2015/04/07
0
0
2018国际智能网联汽车创新峰会4月开幕,五大看点,不容错过!

ICVIS2018国际智能网联汽车创新峰会4月12-13号在上海与您不见不散! 随着“车联网”“自动驾驶”“智能网联汽车”概念越来越多地被提及,汽车智能化、网联化的发展趋势及其所带动的ADAS、车联...

行者武松
04/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis常用命令

keys 我把这个命令放在第一位,是因为笔者曾经做过的项目,以及一些朋友的项目,都因为使用keys这个命令,导致出现性能毛刺。这个命令的时间复杂度是O(N),而且redis又是单线程执行,在执行k...

谢思华
39分钟前
2
0
关于css宽度分离

所谓宽度分离就是width 属性不与影响宽度的 padding/border(有时候包括 margin)属性共存 例如: .box{width:200px;padding:20px;border:1px solid;} 为何要做宽度分离 一说到分离就是为了好...

莫西摩西
50分钟前
1
0
Linux常用命令

###############常用命令说明############################## cat /proc/version 显示内核的版本 mv dir1 new_dir 重命名/移动 一个目录 rm -rf a.txt b.txt c.txt 删除多个文件 chmod 777 ......

lyle_luo
57分钟前
3
0
全国地区代码科普

全国地区代码表 天津市 地区代码 地区名称 1100 天津市 辽宁省 地区代码 地区名称 2210 沈阳市 2210 法库县 2210 康平县 2210 辽中县 2210 新民市 2220 大连市 2222 普兰店市 2223 庄河市 22...

恋码之子
57分钟前
1
0
DbForge Schema Compare for MySQL入门教程:生成比较报告

【dbForge Schema Compare for MySQL下载】 当架构比较完成后,您可以生成比较报告以保留架构更改的记录。 1. 在“Comparison” 菜单中,单击“Generate Comparison Report” 。将打开“Gen...

Miss_Hello_World
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部