要求のいくつかのレベルのscrapyフレームワークを実現するために、リストと詳細ページのアモイ車のネットワーク情報ページをクロールscrapyフレームワークを使用します

免責事項:この記事はブロガーオリジナル記事です、ブロガーなく再生してはならないhttps://blog.csdn.net/g_optimistic/article/details/90182050を許可

アモイ車のネットワーク:https://www.taoche.com/

我々は右の都市、ブランドを選択すると、以下のように、URLはなり

scrapyプロジェクトの作成:

scrapy startproject scrapyProject

クモ小さな爬虫類を作成します。

scrapy genspider s_taoche taoche.com

ディレクトリ

1.要求リスト

(1)分析インタフェース

(2)要求URL

(3)ページング

2.items.py

3.解像度一覧ページ

4.解決の詳細ページ

5.pipelines.py

6.settings.py

(1)のrobots.txtプロトコルに準拠する障害

(2)パイプライン

(3)ログファイルを入力します。

7.プロジェクトを実行します

方法の一つます。cmd - > scrapyクロールs_taoche

方法2:main.py


1.要求リスト

(1)分析インタフェース

https://で.taoche.com {} / {} /

} {追加、{}ファーストネーム第二ブランドティム

ブランド名を取得します

方法の一つ:直接の場所、内部のファイルに書き込まれたブランド、直接使用することができますがありました

方法2:=要求URL「https://www.taoche.com/」、ツリーは、XPath住所、ブランド、そしてステッチのURLを使用して構築は、再び要求

さらにバックステップがたくさんあるので、私はこの方法を選ぶだろう

(2)要求URL

s_taoche.py

class STaocheSpider(scrapy.Spider):
    name = 's_taoche'
    allowed_domains = ['taoche.com']
    # 一次请求
    start_urls = []
    'https://chongqing.taoche.com/volkswagen/'
    # 1.生成所有城市不同车型的首页地址
    for city in CITY_CODE:
        for car in CAR_CODE_LIST:
            # url = 'https://{}.taoche.com/{}/'.format(city, car)
            url=f'https://{city}.taoche.com/{car}/'
            start_urls.append(url)

    def parse(self, response):
        pass

(3)ページング

応答要求のURLによって得られました  

1から最大ページ数のためのページでは、完全なURLにスプライス、最大ページ数を横断します

コードの実装:

この場合、直接書き込むことができない二リクエストURL、の必要性は、二次関数は、要求をカプセル化する必要があり、start_urls、

フォーマットの解析機能を使用します

    def parse(self, response):
        # 1.从首页获取最大的页面page
        max_page1 = response.xpath('//div[@class="paging-box the-pages"]/div/a[last()-1]/text()').extract()
        max_page = self.get_value(max_page1)
        # 二次请求,不能直接写在start_urls里面,需要封装一个二次请求的函数
        # 2.列表页的翻页
        'https://chongqing.taoche.com/volkswagen/?page=3'
        for i in range(1, int(max_page) + 1):
            # url=response.url+'?page={}'.format(i)
            url = response.url + f'?page={i}'
            # 3.封装请求  自己写一个parse的函数
            yield scrapy.Request(url=url, callback=self.parse_taoche)  # 看到yield 要挂起
    
    def get_value(self,value):
        if value:
            value=value[0]
        else:
            value=1
        return value

2.items.py

私たちは、items.pyファイルにクロールフィールドを記述する必要があります

リスト:

タイトルタイトル; resisted_dataカード時間、走行距離車、市の都市、価格元の価格; sail_price価格; URL detail_urlの詳細ページ

詳細ページ:

displacement 排量;transmission 变速箱;brand_type 品牌型号;loc_od_lic 牌照所在地;oil_wear 油耗;engine 发动机;

tree_high 长宽高;drive_way 驱动方式;body_type 车身类型;che_level 车辆级别;trunk_cao 后备箱容量

import scrapy


# 写项目之前,要先把字段要起好

class TaoCheItem(scrapy.Item):
    # 列表页
    title = scrapy.Field()  # 标题
    resisted_date = scrapy.Field()  # 上牌时间
    mileage = scrapy.Field()  # 车程
    city = scrapy.Field()  # 城市
    price = scrapy.Field()  # 原价
    sail_price = scrapy.Field()  # 售价
    detail_url = scrapy.Field()  # 详情页的url
    # 详情页
    displacement = scrapy.Field()  # 排量
    transmission = scrapy.Field()  # 变速箱
    brand_type = scrapy.Field()  # 品牌型号
    loc_od_lic = scrapy.Field()  # 牌照所在地
    oil_wear = scrapy.Field()  # 油耗
    engine = scrapy.Field()  # 发动机
    tree_high = scrapy.Field()  # 长宽高
    drive_way = scrapy.Field()  # 驱动方式
    body_type = scrapy.Field()  # 车身类型
    che_level = scrapy.Field()  # 车辆级别
    trunk_cao = scrapy.Field()  # 后备箱容量

3.解析列表页

请自行去找要爬取的列表页的字段

详情页的url在标题的a标签里面

获得详情页的链接以后,要再次请求detail_url  

scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'data': item}, encoding='utf-8',
                                 dont_filter=True)
把请求的重复的url过滤掉 dont_filter=True

代码如下:

# 列表页的解析函数
    def parse_taoche(self, response):
        # 1.获取整个车辆信息
        car_info_list = response.xpath('//ul[@class="gongge_ul"]/li')
        for car in car_info_list:
            title = car.xpath('./div[2]/a/span/text()').extract()  # 标题
            title = self.get_value(title)
            resisted_date = car.xpath('./div[2]/p/i[1]/text()').extract()  # 上牌时间
            resisted_date = self.get_value(resisted_date)
            mileage = car.xpath('./div[2]/p/i[2]/text()').extract()  # 车程
            mileage = self.get_value(mileage)
            city = car.xpath('./div[2]/p/i[3]//text()').extract()  # 城市
            city = ''.join([i.strip() for i in city])
            # city=self.get_value(city)
            price = car.xpath('./div[2]/div[1]/i[3]/text()').extract()  # 原价
            price = self.get_value(price)
            sail_price = car.xpath('./div[2]/div[1]/i[2]//text()').extract()
            sail_price = ''.join(sail_price)  # 售价
            detail_url = car.xpath('./div[2]/a/@href').extract()  # 详情页的url
            detail_url = 'https:' + self.get_value(detail_url)
            # 2.实例化:
            item = TaoCheItem()
            # 3.赋值
            item['title'] = title
            item['resisted_date'] = resisted_date
            item['mileage'] = mileage
            item['city'] = city
            item['price'] = price
            item['sail_price'] = sail_price
            item['detail_url'] = detail_url
            yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'data': item}, encoding='utf-8',
                                 dont_filter=True)
            # 把请求的重复的url过滤掉 dont_filter=True

4.解析详情页

详情页所需的字段在以下的位置

具体的xpath的过程我就不展示了,很容易找到的

代码如下:

# 解析详情页
    def parse_detail(self, response):
        # print(response.url)
        li_list = response.xpath('//div[@class="row parameter-configure"]/div[2]/ul')[0]
        displacement = li_list.xpath('./li[1]//text()').extract()
        displacement = ''.join([i.strip() for i in displacement])  # 排量
        oil_wear = li_list.xpath('./li[2]//text()').extract()
        oil_wear = ''.join(oil_wear)  # 油耗
        tree_high = li_list.xpath('./li[3]//text()').extract()
        tree_high = ''.join(tree_high)  # 长宽高
        body_type = li_list.xpath('./li[4]//text()').extract()
        body_type = ''.join(body_type)  # 车身类型
        trunk_cao = li_list.xpath('./li[5]//text()').extract()
        trunk_cao = ''.join(trunk_cao)  # 后备箱容量
        ul_box = response.xpath('//div[@class="row parameter-configure"]/div[1]/ul')[0]
        brand_type = ul_box.xpath('./li[1]/span//text()').extract()
        brand_type = ''.join(brand_type)  # 品牌型号
        loc_od_lic = ul_box.xpath('./li[2]/span//text()').extract()
        loc_od_lic = ''.join(loc_od_lic)  # 牌照所在地
        engine = ul_box.xpath('./li[3]/span//text()').extract()
        engine = ''.join(engine)  # 发动机
        drive_way = ul_box.xpath('./li[4]/span//text()').extract()
        drive_way = ''.join(drive_way)  # 驱动方式
        che_level = ul_box.xpath('./li[5]/span//text()').extract()
        che_level = ''.join(che_level).strip()  # 车辆级别
        transmission = response.xpath('//div[@class="summary-attrs"]/dl[3]/dd/text()').extract()[0]
        transmission = transmission.split('/')[1]  # 变速箱
        item = response.meta['data']
        item['displacement'] = displacement
        item['transmission'] = transmission
        item['brand_type'] = brand_type
        item['loc_od_lic'] = loc_od_lic
        item['oil_wear'] = oil_wear
        item['engine'] = engine
        item['tree_high'] = tree_high
        item['drive_way'] = drive_way
        item['body_type'] = body_type
        item['che_level'] = che_level
        item['trunk_cao'] = trunk_cao
        # print(item)
        yield item

5.pipelines.py

保存数据

class TaoChePipeline(object):
    def process_item(self, item, spider):
        fp = open('taoche.txt', 'a', encoding='utf-8')
        json.dump(dict(item), fp, ensure_ascii=False)
        return item

6.settings.py

要修改的内容

(1)不遵守robots.txt协议

(2)pipeline

(3)输入日志文件

7.运行项目

方法一:cmd-->scrapy crawl s_taoche

方法二:main.py

from scrapy import cmdline

cmdline.execute("scrapy crawl s_taoche --nolog".split())
cmdline.execute("scrapy crawl s_taoche".split())

第一行说明:

无论settings里是否设置了LOG_FILE、LOG_ENABLED等四项,控制台与taoche.log文件都不会出现日志内容

第二行说明:

若settings里设置了LOG_FILE、LOG_ENABLED等四项,命令行就不会打印日志内容,但是日志内容会保存到taoche.log文件中

若settings里没设置LOG_FILE、LOG_ENABLED等四项,命令行就会打印出日志内容

  是否设置了settings.py 命令行是否会出现日志内容 ログファイルに保存されません
1   ノー ノー
2 それはあります ノー それはあります
2 ノー それはあります ノー

 

 

おすすめ

転載: blog.csdn.net/g_optimistic/article/details/90182050