0

    Scrapy翻页爬取示例——列表页、详情页

    2023.07.01 | admin | 134次围观

    向下翻会看到翻页的小图标:

    假如我们要获取1-17页该页面上所有的字符串,如下所示:

    应该如何做?

    先给出代码(仅逻辑实现部分):

        def parse(self, response):
            divs = response.xpath("//div[@class='css-rv942s']")
            for div in divs:
                item = ThaiItem()
                item['en'] = div.xpath("./span[@class='css-1sylyko']/a/text()").extract_first()
                item['thai'] = div.xpath("./span[@class='css-epvm6']/span/div[@class='css-jiq801']/text()").extract_first()
                yield item
    		# 获取字符串,构造下一页请求地址
            next = response.xpath("//div[@class='css-x9n345']/div/a[last()]/@href").extract_first()
            new_url = 'https://engoo.co.th' + next
            yield scrapy.Request(url=new_url, callback=self.parse)
    

    分析:构造获取下一页的请求很重要,要想办法得到下一页的请求。在这个例子中,下一页的请求永远在最后一个a标签的href属性中。

    例如当前我们在第三页,看一下网页布局:

    示例二:爬取详情

    网页中蓝色部分的英文都是超链接,点击进入详情页:

    如何通过首页进入到详情页并爬取其中的内容呢?见以下代码:

    首先通过start_requests函数获取所有首页起始地址:

        def start_requests(self):
            # 获取全部翻页链接
            for i in range(1, 17):
                url = 'https://engoo.co.th/app/words/list/en/a?page=' + str(i)
                yield scrapy.Request(url=url)
    

    紧接着,获取首页上每个英文单词的超链接:

    # 获取每页的url
        def parse(self, response):
            urls = response.xpath("//div[@class='css-rv942s']/span/a/@href").extract()
            for url in urls:
                url_new = "https://engoo.co.th" + url
                yield scrapy.Request(url_new, callback=self.parse_item)
    

    重要:通过start_requests函数得到起始地址后淘宝详情页去间隙代码,直接在parse函数获得url字符串淘宝详情页去间隙代码,拼接得到详情页的地址:url_new。详情页的内容通过Request发送到parse_item函数进行解析。

    parse_item函数代码如下:

        def parse_item(self, response):
            divs_top = response.xpath("//div[@class='css-1p8520y']")
            item = ThaiItem()
            for div in divs_top:
                en_text_l = div.xpath(".//div/span[@class='css-79elbk']/span//text()").extract()
                en_text = ''.join(en_text_l)
                item['en_text'] = en_text
                item['thai_text'] = div.xpath(".//div[@class='css-79elbk']/span[@lang='th']/span/text()").extract_first()
                # print(item)
                yield item
            divs_bot = response.xpath("//div[@class='css-kp3nri']")
            for div in divs_bot:
                item['en_text'] = div.xpath("./div[@class='css-nipsa6']/span[@class='css-35ezg3']/text()").extract_first()
                item['thai_text'] = div.xpath("./div[@class='css-nipsa6']/span[@class='css-l3ddl3']/text()").extract_first()
                # print(item)
                yield item
    

    最后将详情页的内容通过pipelines保存:

    class ThaiPipeline:
        def process_item(self, item, spider):
            res = dict(item)
            en_text = res['en_text']
            thai_text = res['thai_text']
            with open('save.txt', 'a', encoding='utf-8') as fw:
                fw.write(en_text + '\t' + thai_text + '\n')
            return item
    

    反思:写作时思路很混乱,排版也比较粗糙,见谅,领会精神 > w < !!!

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论