摘要:汽車之家車型的簡(jiǎn)單爬取名字自定義配置重新定義起始爬取點(diǎn)所有首字母按照首字母,組合對(duì)應(yīng)的頁(yè)面,壓入根據(jù),抓取頁(yè)面定義默認(rèn)的抓取函數(shù)品牌編號(hào)品牌名品牌品牌小類別品牌小類別對(duì)應(yīng)的頁(yè)面品牌小類別的編號(hào)品牌小類別名品牌小類別對(duì)應(yīng)的頁(yè)面的
汽車之家車型的簡(jiǎn)單爬取
spider
# -*- coding: utf-8 -*- import scrapy from scrapy import Request from mininova.items import carItem import sys reload(sys) sys.setdefaultencoding("utf8") class SplashSpider(scrapy.Spider): #spider名字 name = "car_home" allowed_domains = ["autohome.com.cn"] start_urls = [ ] # 自定義配置 custom_settings = { "ITEM_PIPELINES": { "mininova.pipelines.CarPipeline": 300, } } def start_requests(self): #重新定義起始爬取點(diǎn) #所有首字母 words = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] #按照首字母,組合對(duì)應(yīng)的頁(yè)面,壓入start_urls for word in words: self.start_urls.append("https://www.autohome.com.cn/grade/carhtml/"+word+".html") #根據(jù)start_urls,抓取頁(yè)面 for url in self.start_urls: yield Request(url,meta={"word":word}) #定義默認(rèn)的抓取函數(shù) def parse(self, response): print("url") print(response.url) word = response.meta["word"] car_cates = response.xpath("http://dl").extract() brand_id = 0 total_cars = [] for brand_index in range(len(car_cates)): #品牌編號(hào) brand_num = brand_index + 1 brand_num = str(brand_num) #品牌名 brand = response.xpath("http://dl["+brand_num+"]/dt/div[1]/a/text()").extract()[0] print("brand:"+brand) #品牌logo brand_logo_url = response.xpath("http://dl["+brand_num+"]/dt//img[1]/@src").extract()[0] #品牌小類別 brand_items = response.xpath("http://dl["+brand_num+"]/dd//div[@class="h3-tit"]/a/text()").extract() #品牌小類別對(duì)應(yīng)的頁(yè)面 brand_item_urls = response.xpath("http://dl["+brand_num+"]/dd//div[@class="h3-tit"]/a/@href").extract() for brand_item_index in range(len(brand_items)): #品牌小類別的編號(hào) brand_item_num = brand_item_index + 1 brand_item_num = str(brand_item_num) #品牌小類別名 brand_item = brand_items[brand_item_index] #品牌小類別對(duì)應(yīng)的頁(yè)面的url brand_item_url = brand_item_urls[brand_item_index] print("brand_item:"+brand_item) print("brand_item_url:"+brand_item_url) #品牌小類別中的所有車 cars = response.xpath("http://dl["+brand_num+"]/dd//ul[@class="rank-list-ul"]["+brand_item_num+"]/li[@id]").extract() print("cars_count:"+str(len(cars))) for car_index in range(len(cars)): car_num = car_index + 1 car_num = str(car_num) #具體車的名稱 name = response.xpath("http://dl["+brand_num+"]/dd//ul[@class="rank-list-ul"]["+brand_item_num+"]/li[@id]["+car_num+"]/h4/a/text()").extract()[0] #車對(duì)應(yīng)的頁(yè)面 url = response.xpath("http://dl["+brand_num+"]/dd//ul[@class="rank-list-ul"]["+brand_item_num+"]/li[@id]["+car_num+"]/h4/a/@href").extract()[0] #報(bào)價(jià)(最低價(jià)-最高價(jià)) price = response.xpath("http://dl["+brand_num+"]/dd//ul[@class="rank-list-ul"]["+brand_item_num+"]/li[@id]["+car_num+"]/div[1]/a/text()").extract()[0] prices = price.split("-") price_base = "萬(wàn)" if len(prices) != 2: max_price = "暫無(wú)" min_price = "暫無(wú)" else: max_price = str(prices[1].replace(price_base,"")) min_price = str(prices[0]) print("car:"+name+" max_price:"+str(max_price)+" min_price:"+str(min_price)+" price_base:"+price_base) car_item = carItem() car_item["name"] = name car_item["url"] = url car_item["brand_item"] = brand_item car_item["first_word"] = word car_item["brand"] = brand car_item["brand_logo_url"] = brand_logo_url car_item["max_price"] = max_price car_item["min_price"] = min_price total_cars.append(car_item) return total_cars
item
# -*- coding: utf-8 -*- import scrapy class carItem(scrapy.Item): #具體車名 name = scrapy.Field() #對(duì)應(yīng)的介紹頁(yè)面url url = scrapy.Field() #最高報(bào)價(jià),單位(萬(wàn)) max_price = scrapy.Field() #最低報(bào)價(jià),單位(萬(wàn)) min_price = scrapy.Field() #品牌名 brand = scrapy.Field() #品牌logo brand_logo_url = scrapy.Field() #品牌小類別名 brand_item = scrapy.Field() #品牌首字母 first_word = scrapy.Field()
mongo_car
from mininova.mongodb import Mongo from mininova.settings import mongo_setting class MongoCar(): db_name = "car" brand_set_name = "brand" brand_item_set_name = "brand_item" car_set_name = "car" def __init__(self): self.db = Mongo(mongo_setting["mongo_host"],mongo_setting["mongo_port"],mongo_setting["mongo_user"],mongo_setting["mongo_password"]) def insert(self,item): brand_where = {"name":item["brand"]} brand = self.brand_exist(self.db,brand_where) if brand == False: brand = {"name":item["brand"],"first_word":item["first_word"]} brand = self.insert_brand(self.db,brand) print("brand insert ok!") else: brand = {"name":item["brand"],"first_word":item["first_word"],"logo_url":item["brand_logo_url"]} brand = self.update_brand(self.db,brand_where,brand) print("brand_exist!") brand_item_where = {"name":item["brand_item"]} brand_item = self.brand_item_exist(self.db,brand_item_where) if brand_item == False: brand_item = {"name":item["brand_item"],"first_word":item["first_word"],"brand_id":brand["_id"]} brand_item = self.insert_brand_item(self.db,brand_item) print("brand_item insert ok!") else: print("brand_item_exist!") car_where = {"name":item["brand_item"],"name":item["name"]} car = self.car_exist(self.db,car_where) if car == False: car = {"name":item["name"],"url":item["url"],"max_price":item["max_price"],"min_price":item["min_price"],"first_word":item["first_word"],"brand_id":brand["_id"],"brand_item_id":brand_item["_id"]} car = self.insert_car(self.db,car) print("car insert ok!") else: print("car_exist!") if car != False: return True; else: return False; def update_brand(self,db,brand_where,brand): my_set = db.set(self.db_name,self.brand_set_name) my_set.update_one(brand_where,{"$set":brand}) exist = my_set.find_one(brand_where) if(exist is None): return False else: return exist def brand_exist(self,db,brand): my_set = db.set(self.db_name,self.brand_set_name) exist = my_set.find_one(brand) if(exist is None): return False else: return exist def insert_brand(self,db,brand): my_set = db.set(self.db_name,self.brand_set_name) my_set.insert_one(brand) brand = my_set.find_one(brand) return brand def brand_item_exist(self,db,brand_item): my_set = db.set(self.db_name,self.brand_item_set_name) exist = my_set.find_one(brand_item) if(exist is None): return False else: return exist def insert_brand_item(self,db,brand_item): my_set = db.set(self.db_name,self.brand_item_set_name) my_set.insert_one(brand_item) brand = my_set.find_one(brand_item) return brand def car_exist(self,db,car): my_set = db.set(self.db_name,self.car_set_name) exist = my_set.find_one(car) if(exist is None): return False else: return exist def insert_car(self,db,car): my_set = db.set(self.db_name,self.car_set_name) my_set.insert_one(car) brand = my_set.find_one(car) return brand
pipeline
from mininova.settings import settings import pymysql import os from mininova.db import Bookdb from mininova.mongo_novel import MongoNovel from mininova.mongo_car import MongoCar import copy class CarPipeline(object): def process_item(self,item,spider): mongo_car = MongoCar() mongo_car.insert(item) print(item["name"]) print("item insert ok!")
setting
mongo_setting = { "mongo_host" : "xxx.xxx.xxx.xxx", "mongo_port" : 27017, "mongo_user" : "username", "mongo_password" : "password" }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43814.html
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:都說(shuō)年末了,該給自己寫寫總結(jié)了。我現(xiàn)在做一些簡(jiǎn)單的爬蟲都會(huì)用它。并且對(duì)數(shù)據(jù)的實(shí)時(shí)性要求較高,或者爬數(shù)據(jù)的時(shí)候封的太厲害了。對(duì)于這一類的爬蟲。消息隊(duì)列用于分發(fā)消息給某個(gè)爬蟲節(jié)點(diǎn)。爬蟲節(jié)點(diǎn)完成具體的爬蟲,格式化爬蟲數(shù)據(jù)。最后,感謝我的,謝謝 都說(shuō)年末了,該給自己寫寫總結(jié)了。今天我想談一談的是我在公司這一年多里的負(fù)責(zé)的部分工作---爬蟲。做了這么久的爬蟲,是該寫點(diǎn)什么,留下點(diǎn)什么。在我所負(fù)責(zé)...
摘要:原文地址爬取汽車之家二手車產(chǎn)品庫(kù)項(xiàng)目地址目標(biāo)最近經(jīng)常有人在耳邊提起汽車之家,也好奇二手車在國(guó)內(nèi)的價(jià)格是怎么樣的,因此本次的目標(biāo)站點(diǎn)是汽車之家的二手車產(chǎn)品庫(kù)分析目標(biāo)源一頁(yè)共條含分頁(yè),但這個(gè)老產(chǎn)品庫(kù),在頁(yè)后會(huì)存在問(wèn)題,因此我們爬取頁(yè)可以獲取全 原文地址:爬取汽車之家 二手車產(chǎn)品庫(kù)項(xiàng)目地址:https://github.com/go-crawler... 目標(biāo) 最近經(jīng)常有人在耳邊提起汽車之家...
摘要:不過(guò)不用擔(dān)心,中有很多非常優(yōu)秀的爬蟲框架,比如我們接下來(lái)要學(xué)習(xí)到的。結(jié)合以上分析我們基本確定了本次爬蟲的各個(gè)路線入口,接下來(lái)我們就開始通過(guò)程序來(lái)實(shí)現(xiàn)本次的目標(biāo)。這里我們的目的是建立一種寫爬蟲的思路,而不在于怎么使用工具來(lái)爬數(shù)據(jù)。 概述 在上一篇文章《爬蟲學(xué)習(xí)之一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲》中我們對(duì)爬蟲的概念有了一個(gè)初步的認(rèn)識(shí),并且通過(guò)Python的一些第三方庫(kù)很方便的提取了我們想要的內(nèi)容,但是...
摘要:圖意淫爬蟲與反爬蟲間的對(duì)決數(shù)據(jù)的重要性如今已然是大數(shù)據(jù)時(shí)代,數(shù)據(jù)正在驅(qū)動(dòng)著業(yè)務(wù)開發(fā),驅(qū)動(dòng)著運(yùn)營(yíng)手段,有了數(shù)據(jù)的支撐可以對(duì)用戶進(jìn)行用戶畫像,個(gè)性化定制,數(shù)據(jù)可以指明方案設(shè)計(jì)和決策優(yōu)化方向,所以互聯(lián)網(wǎng)產(chǎn)品的開發(fā)都是離不開對(duì)數(shù)據(jù)的收集和分析,數(shù) showImg(https://segmentfault.com/img/remote/1460000013428119?w=539&h=337)...
閱讀 2742·2021-11-22 13:54
閱讀 1082·2021-10-14 09:48
閱讀 2305·2021-09-08 09:35
閱讀 1569·2019-08-30 15:53
閱讀 1180·2019-08-30 13:14
閱讀 619·2019-08-30 13:09
閱讀 2533·2019-08-30 10:57
閱讀 3345·2019-08-29 13:18