scrapy分页抓取网页( 爬虫案例代码地址这里我是使用的Scrapy框架进行爬虫 )

优采云 发布时间: 2022-03-28 11:19

  scrapy分页抓取网页(

爬虫案例代码地址这里我是使用的Scrapy框架进行爬虫

)

  

  由于互联网的飞速发展,目前所有的信息都处于海量积累的状态。我们不仅需要从外界获取大量数据,还要从大量数据中过滤掉无用的数据。对于我们的有益数据,我们需要指定爬取,所以出现了目前的爬虫技术,通过它我们可以快速获取我们需要的数据。但是在这个爬取过程中,信息拥有者会对爬虫进行反爬处理,我们需要一一攻破这些难点。

  前段时间刚做了一些爬虫相关的工作,所以这里有一些相关的经验。

  本文案例代码地址

  这里我使用的是Scrapy框架进行爬取,开发环境的相关版本号:

  Scrapy : 1.5.1

lxml : 4.2.5.0

libxml2 : 2.9.8

cssselect : 1.0.3

parsel : 1.5.1

w3lib : 1.20.0

Twisted : 18.9.0

Python : 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]

pyOpenSSL : 18.0.0 (OpenSSL 1.1.1a 20 Nov 2018)

cryptography : 2.4.2

Platform : Windows-10-10.0.15063-SP0

  对于本地开发环境,建议使用Anaconda安装相关环境,否则可能会出现各种依赖冲突。本文主要使用Xpath提取页面数据,所以在进行本文案例操作之前,先了解一下Xpath的基本使用。

  创建一个 Scrapy 项目

  用scrapy创建项目非常简单,一个命令就可以搞定。接下来,我们创建一个 ytaoCrawl 项目:

  scrapy startproject ytaoCrawl

  请注意,项目名称必须以字母开头,并且只能收录字母、数字和下划线。创建成功后,界面显示:

  

  初始化项目的文件是:

  

  每个文件的用途:

  了解了几个默认生成的文件后,再看下面的scrapy结构*敏*感*词*,还是比较容易理解的。

  

  这样,我们的一个scrapy爬虫项目就创建好了。

  创建蜘蛛

  我们首先创建一个python文件ytaoSpider,它必须继承scrapy.Spider类。接下来,我们以北京58租房信息的爬取为例进行分析。

  #!/usr/bin/python3

# -*- coding: utf-8 -*-

#

# @Author : YangTao

# @blog : https://ytao.top

#

import scrapy

class YtaoSpider(scrapy.Spider):

# 定义爬虫名称

name = "crawldemo"

# 允许爬取的域名,但不包含 start_urls 中的链接

allowed_domains = ["58.com"]

# 起始爬取链接

start_urls = [

"https://bj.58.com/chuzu/?PGTID=0d100000-0038-e441-0c8a-adeb346199d8&ClickID=2"

]

def download(self, response, fName):

with open(fName + ".html", 'wb') as f:

f.write(response.body)

# response 是返回抓取后的对象

def parse(self, response):

# 下载北京租房页面到本地,便于分析

self.download(response, "北京租房")

  通过执行命令启动爬虫,指定爬虫名称:

  scrapy crawl crawldemo

  当我们有多个爬虫时,我们可以通过scrapy list获取所有爬虫名称。

  当然,你也可以在开发过程中使用mian函数在编辑器中启动:

  if __name__ == '__main__':

name = YtaoSpider.name

cmd = 'scrapy crawl {0} '.format(name)

cmdline.execute(cmd.split())

  这时候我们爬取的页面就会在我们启动的目录下下载生成。

  翻页

  上面我们只爬了第一页,但是在实际爬取数据的过程中,肯定会涉及到分页,所以我们观察到网站的分页是为了显示最后一页(最多58只在显示前)七十页数据),如图所示。

  

  从下图中观察分页代码的 html 部分。

  

  接下来通过Xpath和正则匹配得到最后一页的页码。

<p>def pageNum(self, response):

# 获取分页的 html 代码块

page_ele = response.xpath("//li[@id=&#39;pager_wrap&#39;]/div[@class=&#39;pager&#39;]")

# 通过正则获取含有页码数字的文本

num_eles = re.findall(r">\d+", "").replace("

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线