scrapy分页抓取网页( 爬虫案例代码地址这里我是使用的Scrapy框架进行爬虫 )
优采云 发布时间: 2022-03-28 11:19scrapy分页抓取网页(
爬虫案例代码地址这里我是使用的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='pager_wrap']/div[@class='pager']")
# 通过正则获取含有页码数字的文本
num_eles = re.findall(r">\d+", "").replace("