上一篇中我们搞定了基于终端和管道的数据存储。
这里我们尝试爬取一下全站数据。那么,何为全站数据爬取呢?
就是将网站中某板块下的全部页码对应的页面数据进行爬取,我这里的需求很简单,就是爬取贝壳网二手房页面所有的二手房标题。
我这里使用的仍然是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
执行代码,输出:
开始爬虫……
开始写入数据库……
结束写入数据库……
结束爬虫……
打开数据库,看看数据是否已经写入数据库:
至此,基于scrapy框架的全站数据爬取,已完成。当然,这只是一个小示例。参考就好。
有好的建议,请在下方输入你的评论。