Python爬虫(十九)基于scrapy全站数据爬取

262 阅读2分钟

上一篇中我们搞定了基于终端和管道的数据存储。

这里我们尝试爬取一下全站数据。那么,何为全站数据爬取呢?

就是将网站中某板块下的全部页码对应的页面数据进行爬取,我这里的需求很简单,就是爬取贝壳网二手房页面所有的二手房标题。

我这里使用的仍然是scrapy框架来实现。

 

那么我们应该如何实现呢?

我第一个想到的方法就是将所有需要爬取的页面都放入start_url列表里边。但是,在一瞬间这个方法就被我否定了,这个方法是在是不合理,数据必然会分页显示,页码少还可以,页码多就不行了。

 

那么改怎么办呢?这个要具体网站具体分析了

我测试的网站是贝壳网:dl.ke.com/ershoufang/

第二页的链接是:dl.ke.com/ershoufang/…

第三页的链接是:dl.ke.com/ershoufang/…

大概是找到规律了,第二页是pg2,第三页是pg3,那么我们只需要变动链接中的pg*就可以了。

 

既然是这个样子,那么我们来将测试持久化存储的代码复制过来,小小的改造一下,没想到吧,哈哈哈。

 

上次的代码只是爬取一页中的数据,我这里的要求是爬取全站数据。规律上边已经分析过了。

上代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/3/31 18:01
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : beike.py
# @Software: PyCharm

import time

import scrapy
import asyncio
import requests
import random
from scrpayProject.items import ScrpayprojectItem

# 解析贝壳二手房页面的房源图片及标题
class TotalBeikeSpider(scrapy.Spider):
    name = 'totalBeike'
    # allowed_domains = ['www.beike.com']
    start_urls = ['https://dl.ke.com/ershoufang/']

    page_num = 1
    def parse(self, response):
        divList = response.xpath('/html/body/div[1]/div[4]/div[1]/div[4]/ul/li[1]')
        title = []
        for div in divList:
            temp = {}
            title = div.xpath('//ul[@class="sellListContent"]//img[@class="lj-lazy"]/@title').extract()
            for it in title:
                item = ScrpayprojectItem()
                item['author'] = it # author属性必须在items.py中声明
                # item['author'] = author
                yield item  # 将item提交给管道

            if self.page_num <= 20:
                new_url = 'https://dl.ke.com/ershoufang/pg'+str(self.page_num)+'/'
                self.page_num += 1
                # 手动请求发送:callback回调函数是专门用作与数据解析
                yield scrapy.Request(url=new_url,callback=self.parse)

 

代开终端,输出:

scrapy crawl totalBeike

执行代码,输出:

开始爬虫……
开始写入数据库……
结束写入数据库……
结束爬虫……

 

打开数据库,看看数据是否已经写入数据库:

1111111111111111.png

至此,基于scrapy框架的全站数据爬取,已完成。当然,这只是一个小示例。参考就好。

 

有好的建议,请在下方输入你的评论。