php 爬虫抓取网页数据(如何在PyCharm中安装Python第三方库的Scrapy框架?|)

优采云 发布时间: 2022-02-06 13:16

  php 爬虫抓取网页数据(如何在PyCharm中安装Python第三方库的Scrapy框架?|)

  说起爬虫,就不得不提到Scrapy框架,因为它可以帮助提高爬虫的效率,从而更好的实现爬虫。

  Scrapy 是一个应用程序框架,用于爬取网页数据并提取结构数据。框架封装,包括request(异步调度和处理),downloader(多线程Downloader),parser(选择器)和twisted(异步处理)等。对于网站的内容爬取,速度非常快。

  也许读者会感到困惑。有这么好的爬虫框架,为什么还要在前面的章节中学习使用requests库来请求网页数据。其实requests是一个非常强大的库,可以满足大部分网页数据获取的需求。它的工作原理是向服务器发送数据请求。至于数据的下载和解析,需要自己处理,灵活性高;但是,由于对 Scrapy 框架的封装,降低了它的灵活性。

  至于使用哪种爬虫方式,完全看个人的实际需求。在没有明确需求之前,笔者还是建议初学者先选择requests库来请求网页数据,然后在业务实践中产生实际需求时再考虑Scrapy框架。

  Scrapy安装直接使用pip安装Scrapy会产生一些错误的安装提示,导致Scrapy无法正常安装。当然,既然有问题,就必须有很多解决方案。在 ~gohlke/pythonlibs 网站 中,有很多为 Windows 编译的 Python 第三方库。读者只需要根据错误的安装提示找到对应的包并安装即可。详细解释此方法。本节主要介绍如何在 PyCharm 中安装 Scrapy。

  第一步是选择Anaconda 3作为编译环境。在PyCharm中,点击左上角的File选项,点击“设置”按钮,会弹出如图1所示的界面,然后展开Project Interpreter的下拉菜单,选择Anaconda的下拉菜单3:

  

  图1

  这里需要提前安装Anaconda,安装后可以添加Anaconda编译环境。

  第二步是安装 Scrapy。点击图1界面右上角的绿色加号按钮,弹出图2所示界面。键入并搜索“scrapy”,然后单击“安装包”按钮。等到出现“Package'scrapy'安装成功”:

  

  图 2

  案例:使用 Scrapy 捕获股票报价本案例中,Scrapy 框架将用于捕获某证券的网站A 股报价。爬取过程分为以下五个步骤: 创建一个Scrapy爬虫项目并调用CMD,输入以下代码并按[Enter]键创建一个Scrapy爬虫项目:

  scrapy startproject stockstar

  其中scrapy startproject为固定命令,stockstar为作者设置的项目名称。

  运行上述代码的目的是创建对应的工程文件如下:

  项目结构如图3所示:

  

  图 3 项目结构

  创建scrapy项目后,设置文件中有这样一条默认启用的语句。

  POBOTSOXT_OBEY = 真

  robots.txt 是遵循机器人协议的文件。Scrapy启动后,首先会访问网站的robots.txt文件,然后判断网站的爬取范围。有时我们需要将此配置项设置为 False。在settings.py文件中,修改文件属性的方法如下。

  ROBOTSTXT_OBEY=假

  右击E:\stockstar\stockstar文件夹,在弹出的快捷菜单中选择“Mark Directory as”命令→选择“Sources Root”命令,可以使导入包的语法更加简洁,如如图 4 所示。

  

  图 4

  定义一个item container item是一个用于存储爬取数据的容器,其用法类似于Python字典。它提供了一种额外的保护机制来避免由拼写错误导致的未定义字段错误。

  首先,需要对要爬取的网页数据进行分析,定义爬取记录的数据结构。在对应的items.py中创建对应的字段,详细代码如下:

  

import scrapy

from scrapy.loader import ItemLoader

from scrapy.loader.processors import TakeFirst

class StockstarItemLoader (ItemLoader):

#自定义itemloader,用于存储爬虫所抓取的字段内容

default_output_processor = TakeFirst()

class StockstarItem (scrapy.Item) : # 建立相应的字段

#define the fields for your item here like:

#name = scrapy.Field()

code = scrapy.Field() # 股票代码

abbr = scrapy.Field() # 股票简称

last_trade = scrapy.Field() # 最新价

chg_ratio = scrapy.Field() # 涨跌幅

chg_amt = scrapy.Field() # 涨跌额

chg_ratio_5min = scrapy.Field() # 5分钟涨幅

volumn = scrapy.Field() # 成交量

turn_over = scrapy.Field() # 成交额

  定义基本爬虫设置的设置文件。在对应的settings.py文件中定义可以显示中文的JSON Lines Exporter,并将爬取间隔设置为0.25秒。详细代码如下:

  

from scrapy.exporters import JsonLinesItemExporter #默认显示的中文是阅读性较差的Unicode字符

#需要定义子类显示出原来的字符集(将父类的ensure_ascii属性设置为False即可)

class CustomJsonLinesItemExporter(JsonLinesItemExporter):

def __init__(self, file, **kwargs):

super (CustomJsonLinesItemExporter, self).__init__(file, ensure_ascii=False, **kwargs)

#启用新定义的Exporter类\

FEED_EXPORTERS = {

'json':'stockstar.settings.CustomJsonLinesItemExporter',

}

...

#Configure a delay for requests for the same website (default: 0)

#See http:IIscrapy.readthedocs.org/en/latest/topics/settings.html#download-delay

#See also autothrottle settings and docs DOWNLOAD DELAY = 0.25

  编写爬虫逻辑在编写爬虫逻辑之前,需要在stockstar/spider子文件下创建一个.py文件来定义爬虫的作用域,即初始URL。接下来定义一个名为 parse 的函数来解析服务器返回的内容。

  首先在CMD中输入代码,生成蜘蛛代码如下:

  cd stockstar

  scrapy genspider 股票

  此时会在spider文件夹下创建一个后缀名为stock.py的文件,该文件会生成start_url,即爬虫的起始地址,并创建一个名为parse的自定义函数。后面的爬虫逻辑会写在parse函数中。. 文件详情如图5所示:

  

  图 5

  代码详情如图6所示:

  

  图 6

  然后在spiders/stock.py文件中,定义爬虫逻辑,详细代码如下:

  

import scrapy

from items import StockstarItem, StockstarItemLoader\

class StockSpider(scrapy.Spider):

name = 'stock' #定义爬虫名称

allowed_domains = ['quote.stockstar.com'] #定义爬虫域

start_urls = ['http://quote.stockstar.com/stock/ranklist_a_3_1_1.html']

#定义开始爬虫链接

def parse (self, response) : #撰写爬虫逻辑

page = int (response.url.split("_")[-1].split(".")[0])#抓取页码

item_nodes = response.css('#datalist tr')

for item_node in item_nodes:

#根据item文件中所定义的字段内容,进行字段内容的抓取

item_loader = StockstarItemLoader(item=StockstarItem(), selector = item_node)

item_loader.add_css("code", "td:nth-child(1) a::text")

item_loader.add_css("abbr", "td:nth-child(2) a::text")

item_loader.add_css("last_trade", “td:nth-child(3) span::text")

item_loader.add_css("chg_ratio", "td:nth-child(4) span::text")

item_loader.add_css("chg_amt", "td:nth-child(5) span::text")

item_loader.add_css("chg_ratio_5min","td:nth-child(6) span::text")

item_loader.add_css("volumn", "td:nth-child(7)::text")

item_loader.add_css ("turn_over", "td:nth-child(8) :: text")

stock_item = item_loader.load_item()

yield stock_item

if item_nodes:

next_page = page + 1

next_url = response.url.replace ("{0}.html".format (page) , "{0}.html".format(next_page))

yield scrapy.Request(url=next_url, callback=self.parse)

  代码调试为方便调试,在E:\stockstar下新建main.py,调试代码如下:

  从 scrapy.cmdline 导入执行

  执行(["scrapy","crawl","stock","-o","items.json"])

  相当于在E:\stockstar下执行命令“scrapy crawl stock-o items.json”将爬取的数据导出到items.json文件中。

  E:\stockstar>scrapy crawl stock -o items.json

  可以在代码中设置断点(如spiders/stock.py),然后点击“运行”选项按钮→在弹出的菜单中选择“Debug'main'”命令进行调试,如图7和图 8 所示。

  

  图 7

  

  图 8

  最后在PyCharm中运行Run'main',运行界面如图9所示:

  

  图 9

  将捕获的数据以 JSON 格式保存在项目容器中。知识拓展本文从实战(抢股)讲解Scrapy框架,致力于让初学者快速了解Python爬虫Scrapy框架的使用。

  但毕竟这斯卡比实战的空间有限。如果你想深入了解 Scrapy 框架,我建议你阅读:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线