Python下用Scrapy和MongoDB构建爬虫系统(1)
admin
2023-07-30 22:04:22
0

这篇文章将根据真实的兼职需求编写一个爬虫,用户想要一个Python程序从Stack Overflow抓取数据,获取新的问题(问题标题和URL)。抓取的数据应当存入MongoDB。值得注意的是,Stack Overflow已经提供了可用于读取同样数据的API。但是用户想要一个爬虫,那就给他一个爬虫。

像往常一样,在开始任何抓取工作前,一定要先查看该网站的使用/服务条款,要尊重 robots.txt 文件。抓取行为应该遵守道德,不要在很短时间内发起大量请求,从而导致网站遭受泛洪攻击。对待那些你要抓取的网站,要像对待自己的一样。

安装

我们需要Scrapy库(v0.24.4),以及用于在MongoDB中存储数据的PyMongo库(v2.7.2)。同样需要安装MongoDB。

Scrapy

如果使用OSX或某种Linux,使用pip安装Scrapy(激活命令行):

1 $ pip install Scrapy

如果使用Windows的机器,你需要手动安装一堆依赖库(木羊吐槽:Win下也是有pip的po主你不要黑她,经测可以用上面命令直接安装成功)。请参考官方文档详细说明以及我创建的Youtube视频。

一旦Scrapy安装完毕,可在Python命令行中使用这个命令验证:

12 >>> import scrapy>>>

如果没有出错,安装就完成了。

PyMongo

下一步,使用pip安装PyMongo:

1 $ pip install pymongo

现在可以开始构建爬虫了。

Scrapy工程

先创建一个新的Scrapy工程:

1 $ scrapy startproject stack

这条命令创建了许多文件和文件夹,其中包含一套有助于你快速开始的基本模板:

12345678 ├── scrapy.cfg└── stack    ├── __init__.py    ├── items.py    ├── pipelines.py    ├── settings.py    └── spiders        └── __init__.py

提取数据

items.py文件用于定义存储“容器”,用来存储将要抓取的数据。

StackItem()类继承自Item (文档),主要包含一些Scrapy已经为我们创建好的预定义对象:

123456 import scrapy class StackItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    pass

添加一些想要收集的项。用户想要每条问题的标题和URL。那么,照这样更新items.py:

12345 from scrapy.item import Item, Field class StackItem(Item):    title = Field()    url = Field()

创建蜘蛛

在“spiders”目录下建立一个名为stack_spider.py的文件。这里是见证奇迹发生的地方—-比如在这里告诉Scrapy怎么去找到我们想要的指定数据。正如你想的那样,对于每一个独立的网页,stack_spider.py都是不同的。

我们从定义一个类开始,这个类继承Scrapy的Spider,并添加一些必须的属性:

123456789 from scrapy import Spider  class StackSpider(Spider):    name = \”stack\”    allowed_domains = [\”stackoverflow.com\”]    start_urls = [        \”http://stackoverflow.com/questions?pagesize=50&sort=newest\”,    ]

最初一些变量的含义很容易理解(文档):

  • 定义蜘蛛的名字。
  • allowed_domains 包含构成许可域的基础URL,供蜘蛛去爬。
  • start_urls 是一个URL列表,蜘蛛从这里开始爬。蜘蛛从start_urls中的URL下载数据,所有后续的URL将从这些数据中获取。

XPath选择器

接下来,Scrapy使用XPath选择器在一个网站上提取数据。也就是说,我们可以通过一个给定的XPath选择HTML数据的特定部分。正如Scrapy所称,“XPath是一种选择XML节点的语言,也可以用于HTML。”

使用Chrome的开发者工具,可以很容易找到一个特定的Xpath。简单地检查一个特定的HTML元素,复制XPath,然后修改(如有需要)。

开发者工具同时为用户提供在JavaScript控制台测试XPath选择器的功能,使用$x,如$x(\"//img\"):

继续,通过定义的XPath告诉Scrapy去哪里寻找信息。在Chrom中导航至Stack Overflow网址,寻找XPath选择器。

右键点击第一条问题,选择“插入元素”:

现在从

, //*[@id=\"question-summary-27624141\"]/div[2]中抓取XPath,然后在JavaScript控制台测试它:

也许你会说,这只选择了一条问题。现在需要改变XPath去抓取所有的问题。有什么想法?很简单://div[@class=\"summary\"]/h3

什么意思呢?本质上,这条XPath是说:抓取

的子树中所有这一类

元素的总集。在JavaScript控制台中测试XPath。

请注意我们不会使用Chrome开发者工具的实际输出。在大多数案例中,这些输出仅仅是一个参考,便于直接找到能用的XPath。

现在更新stack_spider.py脚本:


և章将根据真实的兼职需求编写一个爬虫,用户想要一个Python程序从Stack Overflow抓取数据,获取新的问题(问题标题和URL)。抓取的数据应当存入MongoDB。值得注意的是,Stack Overflow已经提供了可用于读取同样数据的API。但是用户想要一个爬虫,那就给他一个爬虫。

像往常一样,在开始任何抓取工作前,一定要先查看该网站的使用/服务条款,要尊重 robots.txt 文件。抓取行为应该遵守道德,不要在很短时间内发起大量请求,从而导致网站遭受泛洪攻击。对待那些你要抓取的网站,要像对待自己的一样。

安装

我们需要Scrapy库(v0.24.4),以及用于在MongoDB中存储数据的PyMongo库(v2.7.2)。同样需要安装MongoDB。

Scrapy

如果使用OSX或某种Linux,使用pip安装Scrapy(激活命令行):

1 $ pip install Scrapy

如果使用Windows的机器,你需要手动安装一堆依赖库(木羊吐槽:Win下也是有pip的po主你不要黑她,经测可以用上面命令直接安装成功)。请参考官方文档详细说明以及我创建的Youtube视频。

一旦Scrapy安装完毕,可在Python命令行中使用这个命令验证:

12 >>> import scrapy>>>

如果没有出错,安装就完成了。

PyMongo

下一步,使用pip安装PyMongo:

1 $ pip install pymongo

现在可以开始构建爬虫了。

Scrapy工程

先创建一个新的Scrapy工程:

1 $ scrapy startproject stack

这条命令创建了许多文件和文件夹,其中包含一套有助于你快速开始的基本模板:

12345678 ├── scrapy.cfg└── stack    ├── __init__.py    ├── items.py    ├── pipelines.py    ├── settings.py    └── spiders        └── __init__.py

提取数据

items.py文件用于定义存储“容器”,用来存储将要抓取的数据。

StackItem()类继承自Item (文档),主要包含一些Scrapy已经为我们创建好的预定义对象:

123456 import scrapy class StackItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    pass

添加一些想要收集的项。用户想要每条问题的标题和URL。那么,照这样更新items.py:

12345 from scrapy.item import Item, Field class StackItem(Item):    title = Field()    url = Field()

创建蜘蛛

在“spiders”目录下建立一个名为stack_spider.py的文件。这里是见证奇迹发生的地方—-比如在这里告诉Scrapy怎么去找到我们想要的指定数据。正如你想的那样,对于每一个独立的网页,stack_spider.py都是不同的。

我们从定义一个类开始,这个类继承Scrapy的Spider,并添加一些必须的属性:

123456789 from scrapy import Spider  class StackSpider(Spider):    name = \”stack\”    allowed_domains = [\”stackoverflow.com\”]    start_urls = [        \”http://stackoverflow.com/questions?pagesize=50&sort=newest\”,    ]

最初一些变量的含义很容易理解(文档):

  • 定义蜘蛛的名字。
  • allowed_domains 包含构成许可域的基础URL,供蜘蛛去爬。
  • start_urls 是一个URL列表,蜘蛛从这里开始爬。蜘蛛从start_urls中的URL下载数据,所有后续的URL将从这些数据中获取。

XPath选择器

接下来,Scrapy使用XPath选择器在一个网站上提取数据。也就是说,我们可以通过一个给定的XPath选择HTML数据的特定部分。正如Scrapy所称,“XPath是一种选择XML节点的语言,也可以用于HTML。”

使用Chrome的开发者工具,可以很容易找到一个特定的Xpath。简单地检查一个特定的HTML元素,复制XPath,然后修改(如有需要)。

开发者工具同时为用户提供在JavaScript控制台测试XPath选择器的功能,使用$x,如$x(\"//img\"):

继续,通过定义的XPath告诉Scrapy去哪里寻找信息。在Chrom中导航至Stack Overflow网址,寻找XPath选择器。

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...