网站程序自带的采集器采集文章( Python爬虫文章入门另一个强大的框架Scrapy文章!)

优采云 发布时间: 2022-03-27 12:01

  网站程序自带的采集器采集文章(

Python爬虫文章入门另一个强大的框架Scrapy文章!)

  

  大家好,我是菜鸟兄弟!

  分享了很多请求,selenium 的 Python 爬虫文章,本文将带你从原理到实战另一个强大的框架 Scrapy。如果你对 Scrapy 感兴趣,不妨跟着这篇文章去做吧!

  

  一、Scrapy 框架介绍

  Scrapy 是:一个快速、高级的屏幕抓取和网页抓取框架,由 Python 语言开发,用于抓取网站并从页面中提取结构化数据。只需实现少量代码,即可快速抓取。

  二、运行原理

  Scrapy框架的运行原理看下图就够了(其实原理比较复杂,几句话说不清楚,感兴趣的读者可以阅读更多相关的文章来了解,这个文章不解释太多)

  

  Scrapy主要包括以下组件:

  三.入门3.1 安装

  第一种:在命令行模式下使用pip命令安装:

  $ pip install scrapy

  第二种:先下载,再安装:

  $ pip download scrapy -d ./

# 通过指定国内镜像源下载

$pip download -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy -d ./

  进入下载目录后,执行以下命令进行安装:

  $ pip install Scrapy-1.5.0-py2.py3-none-any.whl

  3.2使用

  1.) 使用大致分为以下四个步骤 1 创建一个scrapy项目

  scrapy startproject mySpider

  2.) 生成爬虫

  scrapy genspider demo "demo.cn"

  3.) 提取数据

  完善spider 使用xpath等

  4.) 保存数据

  pipeline中保存数据

  3.3 程序运行

  在命令中运行爬虫

  scrapy crawl qb # qb爬虫的名字

  在pycharm中运行爬虫

  from scrapy import cmdline

cmdline.execute("scrapy crawl qb".split())

  四、基本步骤

  Scrapy爬虫框架的具体使用步骤如下:

  "

  选择目标网站

  定义要抓取的数据(通过 Scrapy Items)

  编写一个提取数据的蜘蛛

  执行爬虫获取数据

  数据存储

  "

  五. 目录文件说明

  我们在创建scrapy项目时,继续创建spider,目录结构如下:

  

  下面简单介绍一下各个主文件的作用:

  "

  scrapy.cfg :项目的配置文件

  mySpider/ :项目的 Python 模块,将从中引用代码

  mySpider/items.py :项目的目标文件

  mySpider/pipelines.py :项目的管道文件

  mySpider/settings.py :项目的设置文件

  mySpider/spiders/ : 蜘蛛代码存放的目录

  "

  5.1个scrapy.cfg文件

  项目配置文件。这是文件的内容:

  # Automatically created by: scrapy startproject

#

# For more information about the [deploy] section see:

# https://scrapyd.readthedocs.io/en/latest/deploy.html

[settings]

default = mySpider.settings

[deploy]

#url = http://localhost:6800/

project = mySpider

  5.2 mySpider**/**

  项目的 Python 模块,从中引用代码

  5.3 mySpider/items.py

  项目目标文件

  # Define here the models for your scraped items

#

# See documentation in:

# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy

class MyspiderItem(scrapy.Item):

# define the fields for your item here like:

# name = scrapy.Field()

pass

  一个定义scrapy项目的模块,例如:name = scrapy.Field()

  5.4 mySpider/pipelines.py

  项目的管道文件

  # Define your item pipelines here

#

# Don't forget to add your pipeline to the ITEM_PIPELINES setting

# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html

# useful for handling different item types with a single interface

from itemadapter import ItemAdapter

class MyspiderPipeline:

def process_item(self, item, spider):

return item

  这个文件就是我们所说的管道。在Spider中采集到Item后,会传递给Item Pipeline(管道),这些Item Pipeline组件按照定义的顺序处理这些Item。每个 Item Pipeline 都是一个 Python 类,它实现了简单的方法,例如决定是否应该丢弃和存储这个 Item。以下是item pipeline的一些典型应用:

  5.5 mySpider/settings.py

  项目设置文件

  # Scrapy settings for mySpider project

...

BOT_NAME = 'mySpider' # scrapy项目名

SPIDER_MODULES = ['mySpider.spiders']

NEWSPIDER_MODULE = 'mySpider.spiders'

.......

# Obey robots.txt rules

ROBOTSTXT_OBEY = False # 是否遵守协议,一般给位false,但是创建完项目是是True,我们把它改为False

# Configure maximum concurrent requests performed by Scrapy (default: 16)

#CONCURRENT_REQUESTS = 32 # 最大并发量 默认16

......

#DOWNLOAD_DELAY = 3 # 下载延迟 3秒

# Override the default request headers: # 请求报头,我们打开

DEFAULT_REQUEST_HEADERS = {

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language': 'en',

}

# 爬虫中间件

#SPIDER_MIDDLEWARES = {

# 'mySpider.middlewares.MyspiderSpiderMiddleware': 543,

#}

# 下载中间件

#DOWNLOADER_MIDDLEWARES = {

# 'mySpider.middlewares.MyspiderDownloaderMiddleware': 543,

#}

......

# Configure item pipelines

# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html

#ITEM_PIPELINES = {

# 'mySpider.pipelines.MyspiderPipeline': 300, # 管道

#}

.......

  省略号省略代码,一般重点,并给出注释

  6.mySpider/spiders/ : 蜘蛛代码存放的目录

  import scrapy

class DbSpider(scrapy.Spider):

name = 'db'

allowed_domains = ['douban.com'] # 可以修改

start_urls = ['http://douban.com/'] # 开始的url也可以修改

def parse(self, response):

# pass

  六. 爬虫壳

  Scrapy 终端是一个交互式终端。我们可以在不启动蜘蛛的情况下尝试调试代码。也可以用来测试 XPath 或者 CSS 表达式,看看它们是如何工作的,方便从我们爬取的网页中提取数据,但是一般用的不多。有兴趣可以查看官方文档:

  官方文档

  ​​​​

  Scrapy Shell 会根据下载的页面自动创建一些方便的对象,例如 Response 对象,Selector 对象(用于 HTML 和 XML 内容)。

  选择器选择器

  "

  Scrapy Selectors 内置 XPath 和 CSS Selector 表达机制

  "

  Selector有四种基本方法,最常用的是xpath:

  七、*敏*感*词*实战

  本节以使用Scrapy爬取站酷数据为例

  

  7.1 案例说明

  现在我们已经对scrapy的工作流程和原理有了初步的了解,下面我们来做一个入门的小案例,爬取酷炫首页推荐的物品信息。如下图所示,一个小方框是物品信息。我们要提取每个项目的六个组成部分:

  imgLink(封面图片链接);标题(标题);类型(类型);访问者(人气);评论(评论数量);喜欢(推荐人的数量)

  

  那么它只是一个页面的一项,我们还需要通过翻页来实现批量数据采集。

  7.2文件配置目录结构

  在上一篇文章中,我们解释了新的scrapy项目(zcool)和spider项目(zc),这里不再赘述,然后得到我们的目录结构如下图所示:

  

  启动.py 文件

  然后为了方便操作,在zcool目录下新建一个启动文件。并初始化设置。

  from scrapy import cmdline

cmdline.execute('scrapy crawl zc'.split())

  设置.py 文件

  在这个文件中,我们需要进行一些设置

  避免在程序运行时打印日志日志信息

  LOG_LEVEL = 'WARNING'

  ROBOTSTXT_OBEY = False

  添加请求头:

  

  打开管道:

  

  项目.py 文件

  import scrapy

class ZcoolItem(scrapy.Item):

# define the fields for your item here like:

imgLink = scrapy.Field() # 封面图片链接

title = scrapy.Field() # 标题

types = scrapy.Field() # 类型

vistor = scrapy.Field() # 人气

comment = scrapy.Field() # 评论数

likes = scrapy.Field() # 推荐人数

  7.3 页数据提取

  首先,我们在站酷页面上用xpath-helper进行测试:

  

  然后在zc.py文件中做一个初步测试:

  def parse(self, response):

divList = response.xpath('//div[@class="work-list-box"]/div')

print(len(divList))

  运行结果如下图所示:

  

  没有问题,然后我们分别解析提取各种信息,

  def parse(self, response):

divList = response.xpath('//div[@class="work-list-box"]/div')

for div in divList:

imgLink = div.xpath("./div[1]/a/img/@src").extract()[0] # 1.封面图片链接

... 2.title(标题);3 types(类型);4vistor(人气);5comment(评论数) ....

likes = div.xpath("./div[2]/p[3]/span[3]/@title").extract_first() # 6likes(推荐人数)

item = ZcoolItem(imgLink=imgLink,title=title,types=types,vistor=vistor,comment=comment,likes=likes)

yield item

  说明:xpath提取数据方法:

  序列号

  方法和说明

  提炼()

  返回的是所有符合要求的数据,存储在一个列表中。

  extract_first()

  返回的 hrefs 列表中的第一个数据。

  得到()

  与 extract_first() 方法返回的相同,即列表中的第一个数据。

  得到所有()

  和 extract() 方法一样,所有符合要求的数据都会返回并存储在一个列表中。

  注意:

  "

  get() 和 getall() 方法是新方法,而 extract() 和 extract_first() 方法是旧方法。如果无法检索 extract() 和 extract_first() 方法,则返回 None。如果无法检索到 get() 和 getall() 方法,则会引发错误。

  "

  项目实例创建(产生上面的代码行)

  这里我们已经在之前目录文件中配置的item文件中进行了设置。对于数据存储,我们需要在爬虫文件开头导入这个类:

  from zcool.items import ZcoolItem

  然后使用yield返回数据。

  为什么使用yield而不是return

  毫无疑问不能使用return,因为要翻页,使用return直接退出函数;而对于yield:调用时,函数不会立即执行,而是返回一个*敏*感*词*对象。迭代时函数开始执行,yield时返回当前值(i)。之后的这个函数将循环执行,直到没有下一个值。

  7.4 翻页实现批量数据采集

  数据采集可以通过上面的代码初步实现,但是只能在第一页,如下图所示:

  

  但是我们的目标是100页的batch data采集,所以还是需要修改代码。翻页有两种方式:

  方法一:我们先在页面中定位到下一页的按钮,如下图:

  

  然后在 for 循环结束后编写以下代码。

  next_href = response.xpath("//a[@class='laypage_next']/@href").extract_first()

if next_href:

next_url = response.urljoin(next_href)

print('*' * 60)

print(next_url)

print('*' * 60)

request = scrapy.Request(next_url)

yield request

  scrapy.Request():将下一页的url传递给Request函数,进行翻页循环数据采集。

  https://www.cnblogs.com/heymonkey/p/11818495.html # scrapy.Request()参考链接

  注意第一种方法只有在下一页按钮的href对应属性值与下一页的url相同的情况下才有效。

  方法二:定义一个全局变量count = 0,每爬取一页数据加一个,新建一个url,然后使用scrapy.Request()发起请求。

  如下所示:

  count = 1

class ZcSpider(scrapy.Spider):

name = 'zc'

allowed_domains = ['zcool.com.cn']

start_urls = ['https://www.zcool.com.cn/home?p=1#tab_anchor'] # 第一页的url

def parse(self, response):

global count

count += 1

for div in divList:

# ...xxx...

yield item

next_url = 'https://www.kuaikanmanhua.com/tag/0?state=1&sort=1&page={}'.format(count)

yield scrapy.Request(next_url)

  这两种方法在实际情况下是有选择地使用的。

  7.5 数据存储

  数据存储在pipline.py中进行,代码如下:

  from itemadapter import ItemAdapter

import csv

class ZcoolPipeline:

def __init__(self):

self.f = open('Zcool.csv','w',encoding='utf-8',newline='') # line1

self.file_name = ['imgLink', 'title','types','vistor','comment','likes'] # line2

self.writer = csv.DictWriter(self.f, fieldnames=self.file_name) # line3

self.writer.writeheader() # line4

def process_item(self, item, spider):

self.writer.writerow(dict(item)) # line5

print(item)

return item # line6

def close_spider(self,spider):

self.f.close()

  解释:

  7.6 程序运行

  因为 start.py 文件是较早创建并用它初始化的,所以现在运行爬虫不需要在控制台中输入命令:

  scrapy crawl zc(爬虫项目名)

  直接运行start.py文件:得到如下结果:

  

  对应页面:

  

  打开csv文件如下图:(因为csv文件是word乱码,这里我用Notepad++打开)

  

  没问题,数据 采集 完成。

  7.7. 总结

  入门案例需要认真关注,主要是巩固基础知识,为进阶学习做准备。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线