文档章节

抓取搜狐汽车的汽车信息

tavenpy
 tavenpy
发布于 2015/02/05 14:17
字数 736
阅读 7
收藏 0
点赞 0
评论 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
2018国际智能网联汽车创新峰会4月开幕,五大看点,不容错过!

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

行者武松
04/11
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
我们为什么要造自动驾驶汽车?它到底有什么用?

AutoKab 三大金刚:Carlos Holguin, Cristian Sandu 和 Michel Parent 雷锋网(公众号:雷锋网)按:如今,自动驾驶汽车已成超级热词,几乎每周我们都能听到有关它的大新闻。前几周就有两家公...

大壮旅
2017/11/28
0
0
虫草鸟怪!互联网公司起名深意,留给创业者的动物不多了

  先来盘点下互联网公司名字:   植物类的,比如豆瓣、土豆、豆果、西瓜视频、草榴、芒果TV、小米。   动物类的,比如斗鱼、搜狐、搜狗、酷狗、天猫、咸鱼、蚂蚁金服、扇贝单词。   ...

火星科技美少女
01/05
0
0
求惑,怎么获取到所以车辆型号的数据库?

这个问题我想了一阵子,没有一个又便宜又方便的解决办法。 查找一下相关的资料,发现目前有这几种办法。 1.调用第三方接口,某合数据提供的价格是99元调用10000次查询。 2.抓取汽车之家这种专...

Leaybc
2015/03/16
417
0
[评论]当特斯拉宣布开源时 你看到了什么?

如果说人们在转发苹果与三星专利官司的新闻时怀着看热闹的心情,那么在转发特斯拉开放专利的新闻时,我相信,更多的人应该是抱着一份敬畏之心。就在6月12日,特斯拉CEO马斯克在其官方博客上宣...

oschina
2014/06/15
4.1K
29
流量红利消退,汽车互联网该怎么玩?

互联网流量红利消退已是不争的事实,各大互联网巨头也“八仙过海各显神通”,寻找新的出路。前不久,京东与新浪达成涵盖入口、产品层面的战略合作,此前,它还与百度、网易、360等达成类似合...

nh2ihuq6ut8n7so1eyd
04/18
0
0
大数据购车指南:汽车质量哪家强?

(转载请联系微信:xiaosworld) 雨潇君新建立了一个名为“数据实验室”的微信公众号和知乎专栏,那总得写点什么。最近雨潇君想买辆车,就琢磨着写个“大数据购车指南三部曲”:《汽车质量哪...

沈雨潇
2015/09/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
4分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部