首页 > 其他分享 >scrapy--解析HTML结构数据

scrapy--解析HTML结构数据

时间:2024-08-25 19:24:15浏览次数:12  
标签:xpath -- text item scrapy HTML url div class

免责声明:本文仅做演示分享...

目录

拿一页:

qczj.py

拿多页:

 构建start_urls自动发请求

手动发请求

详情页数据解析:

总结写法:


汽车之家数据

--用scrapy自带的xpath进行数据解析


拿一页:

qczj.py

    def parse(self, response):
        # pass
        # print(response.text)
        # 基于scrapy的xpath的解析方式:
        # 响应对象.xpath('xpath表达式')
        divs = response.xpath('//div[@class="list-cont"]')  # 页面中每个div
        for div in divs:
            # name = div.xpath('.//a[@class="font-bold"]/text()')  # [<Selector对象>]

            #         # name = div.xpath('.//a[@class="font-bold"]/text()').extract() # ['数据值']
            #         # name = div.xpath('.//a[@class="font-bold"]/text()').extract_first() # '数据值'
            #         # name = div.xpath('.//a[@class="font-bold"]/text()').get()  # '数据值'
            #         # name = div.xpath('.//a[@class="font-bold"]/text()').getall() # ['数据值']

            #         通过响应对象.xpath得到的是[标签对象]
            #         如果想要从标签对象中取出文本内容
            #         返回字符串,用来获取单个:
            #         get()
            #         extract_first()
            #         返回列表,用来获取多个:
            #         getall()
            #         extract()
            name = div.xpath('.//a[@class="font-bold"]/text()').get()
            # 价格
            price = div.xpath('.//span[@class="font-arial"]/text()').get()
            # 其它信息(级别,续航,电动机)
            # class="info-gray"
            info = ",".join(div.xpath('.//span[@class="info-gray"]/text()').getall())
            print(name, price, info)

拿多页:

 构建start_urls自动发请求

    # 第一种写法:列表推导式,循环url并生成

    # start_urls = [

    #     f"https://car.autohome.com.cn/diandongche/list-20_25-0-0-0-0-0-0-0-{i}.html"

    #     for i in range(1, 11)

    # ]


    # 第二种写法: 往列表中添加数据 列表.append()

    # start_urls = []

    # for i in range(1,11):

    #     start_urls.append(f'https://car.autohome.com.cn/diandongche/list-20_25-0-0-0-0-0-0-0-{i}.html')

手动发请求

# 先访问第一页数据,进入解析方法

    start_urls = ['https://car.autohome.com.cn/diandongche/list-20_25-0-0-0-0-0-0-0-
1.html']
    url = 'https://car.autohome.com.cn/diandongche/list-20_25-0-0-0-0-0-0-0-%s.html'

    page = 1

    def parse(self, response):
        # 获取当前进入解析方法的请求url

        # print(response.url)

        divs = response.xpath('//div[@class="list-cont"]')  # 页面中每个div

        for div in divs:
            name = div.xpath('.//a[@class="font-bold"]/text()').get()
            # 价格

            price = div.xpath('.//span[@class="font-arial"]/text()').get()
            # 其它信息(级别,续航,电动机)

            # class="info-gray"

            info = ','.join(div.xpath('.//span[@class="info-gray"]/text()').getall())
            print(name, price, info)
        # 发起后面的页码请求

        self.page += 1

        #         构造url

        next_url = self.url % (self.page)
        # 发请求

        # 回调函数 解析数据 把当前parse的地址传给callback

        # 作用:发完请求之后,继续进入解析方法对其它页数据进行解析

        if len(divs):# 如果解析出数据还有,就再发请求,否则无法结束

            yield scrapy.Request(url=next_url,callback=self.parse)

详情页数据解析:

很多情况下我们需要拿到主页列表数据之后,还需要进入详情页进行数据获取,这时候也需要借助手动请求的方式进 行数据获取.

def parse(self, response):
        divs = response.xpath('//div[@class="list-cont"]')  # 页面中每个div

        for div in divs:
            name = div.xpath('.//a[@class="font-bold"]/text()').get()
            # 价格

            price = div.xpath('.//span[@class="font-arial"]/text()').get()
            # 其它信息(级别,续航,电动机)

            # class="info-gray"

            info = ','.join(div.xpath('.//span[@class="info-gray"]/text()').getall())
              # 存入item对象中

            item = Scrapy3Item()
            item['name'] = name

            item['price'] = price

            item['info'] = info

            # 要去当前汽车的详情页,就需要获取详情页的url

            detail_url = div.xpath('.//a[@class="font-bold"]/@href').get()
            # https://car.autohome.com.cn/diandongche/series-4278.html#pvareaid=2042206

            #   /diandongche/series-4278.html#pvareaid=2042206

            # 拼接url

            detail_url = 'https://car.autohome.com.cn' + detail_url

#           手动对详情页url发起请求

# meta参数是用来给回调方法传入数据的,传入的格式是字典,字典的key可以自定义,字典的值是你要传入的数据值

            yield scrapy.Request(url=detail_url,callback=self.parse_detail,meta=
{'item':item})
        # 定义一个方法,用来解析详情页数据

    def parse_detail(self, response):
        # 获取item数据 meta是个字典,字典再通过键取值

        item = response.meta['item']
        divs = response.xpath('//div[@class="interval01-list-cars-infor"]')
        types_ls = []
        for div in divs:
            type = div.xpath('./p[1]/a/text()').get()
            types_ls.append(type)
        #     往item对象中添加types属性

        item['types'] = types_ls 
        print(item)

总结写法:

import scrapy
from scrapy_demo1.items import ScrapyDemo1Item

class QczjSpider(scrapy.Spider):
    name = "qczj"
    # allowed_domains = ["qczj.com"]
    start_urls = [
        "https://car.autohome.com.cn/diandongche/list-20_25-0-0-0-0-0-0-0-1.html"
    ]
    #url = "https://car.autohome.com.cn/diandongche/list-20_25-0-0-0-0-0-0-0-%s.html"
    # # 拿多页数据:
    # 分页的思路:
    # 因为框架自动从start_urls中拿到url自动发起请求
    # 如果要实现分页,只需要把分页的url放入列表即可
    page = 1

    def parse(self, response):
        divs = response.xpath('//div[@class="list-cont"]')  # 页面中每个div
        for div in divs:
            name = div.xpath('.//a[@class="font-bold"]/text()').get()
            # 价格
            price = div.xpath('.//span[@class="font-arial"]/text()').get()
            # 其它信息(级别,续航,电动机)
            # class="info-gray"
            info = ",".join(div.xpath('.//span[@class="info-gray"]/text()').getall())
            # 存入item对象中
            item = ScrapyDemo1Item()
            item["name"] = name
            item["price"] = price
            item["info"] = info

            # 要去当前汽车的详情页,就需要获取详情页的url
            detail_url = div.xpath('.//a[@class="font-bold"]/@href').get()
            # https://car.autohome.com.cn/diandongche/series-4278.html#pvareaid=2042206
            #    /diandongche/series-4278.html#pvareaid=2042206
            # 拼接url
            detail_url = "https://car.autohome.com.cn" + detail_url
            #           手动对详情页url发起请求
            yield scrapy.Request(
                url=detail_url,
                callback=self.parse_detail,
                meta={"item": item},  # 传递item对象. 键随便写,值就是item对象.
            )
        # 定义一个方法,用来解析详情页数据
    #进入详细页数据:
    # https://car.autohome.com.cn/diandongche/series-4278.html#pvareaid=2042206
    def parse_detail(self, response):
        # 2个不同的方法,这个字段怎么存呢???
        item = response.meta["item"]  # 取出item对象
        divs = response.xpath('//div[@class="interval01-list-cars-infor"]')
        types_ls = []
        for div in divs:
            type = div.xpath("./p[1]/a/text()").get()
            types_ls.append(type)
        # 往item对象中添加types属性:
        item["types"] = types_ls
        # print(item)

        yield item  # 这里返回item对象,会自动存入到pipelines中.

 

 

 等等...


标签:xpath,--,text,item,scrapy,HTML,url,div,class
From: https://blog.csdn.net/2303_80857229/article/details/141503855

相关文章

  • redis操作
    ``1、string—Strings使用场景:计数器setnameqiyegetnamekeys*查看所有的KEYappappendname1jack2getnameappendnamejackgetnamedelname删除设置多个msetname1jack1name2jack2查看多个mgetname1name2自加:incr自减:decr加:incrby......
  • C语言:函数递归
    目录一、递归1.1递归的思想1.2递归的限制二、递归举例2.1举例1:求n的阶乘 画图推演2.2举例2:顺序打印一个整数的每一位画图推演​编辑  三、递归和迭代一、递归   递归是学习C语言函数绕不开的⼀个话题,那什么是递归呢?递归其实是⼀种解决问题的方法,在C语......
  • 自适应seo高仿草民电影网源码 苹果cmsv10模板
    自适应seo高仿草民电影网源码 苹果cmsv10模板源码介绍自适应SEO高仿草民电影网源码是一款基于苹果CMSv10开发的模板,旨在为用户提供一个高度仿真的草民电影网站体验。该模板不仅在视觉设计上模仿了草民电影网的布局和风格,还特别优化了搜索引擎优化(SEO)功能,以提高网站在搜索引......
  • 影视网站模板源码-响应式网页模板-带后台自适应整站源码
    影视网站模板源码-响应式网页模板-带后台自适应整站源码影视网站模板源码源码介绍本源码是一个响应式影视网站模板,适用于搭建电影、电视剧、动漫等视频内容的在线观看平台。模板采用HTML5、CSS3和JavaScript开发,支持自适应布局,能够在不同设备上提供良好的用户体验。后台管理......
  • 【面试系列】30个常见的初级SQL编程题
    欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:工......
  • 【面试系列】大数据平台常见面试题解答
    欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:工......
  • 19 OptionMenu 组件
    OptionMenu组件使用指南Tkinter的OptionMenu组件是一个下拉选择框,允许用户从一组预定义的选项中选择一个。它通常用于提供用户一个有限的选项集合来选择。以下是对OptionMenu组件的详细说明和一个使用案例。OptionMenu组件属性variable:与OptionMenu组件关联的......
  • 莫队
    普通版前言莫队是由集训队大佬莫涛提出来的,在此再次膜拜大佬!思想普通莫队主要用于离线的区间查询操作,当然,也不是所有的都适用,当一个区间\([l,r]\)的答案可以用\(O(1)\)的时间转化成\([l+1,r],[l-1,r],[l,r+1],[l,r-1]\)的答案,我们就可以考虑使用莫队。具体怎么做呢?其实......
  • tarjan求LCA
    题面如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。思路这次我们要使用的知识点是\(dfs\)和并查集,这个\(tarjan\)是离线的,我们要先把每个点的每一个要跟它求\(LCA\)的点给记录下来,接下来用\(dfs\)跑这么个流程:遍历这个点的每个子结点并进入子节点将子......
  • AC自动机
    简单版题目描述给定\(n\)个模式串\(s_i\)和一个文本串\(t\),求有多少个不同的模式串在文本串里出现过。两个模式串不同当且仅当他们编号不同。思路我们可以将所有模式串存进\(trie\)树中,像这样:此时如果我们朴素地查找,那显然会超时,因此我们可以使用类似\(KMP\)算法......