【问题标题】:Scrapy script , how to find specific keyword and return or print urlScrapy脚本,如何找到特定的关键字并返回或打印url
【发布时间】:2015-11-30 16:03:12
【问题描述】:

好的,所以我必须完全编辑它。我已经让脚本部分工作,我可以毫无问题地启动它,这是脚本。粘贴链接在这里:http://pastebin.com/SKa5Wh1h 你可以看到我在 cmd 行中得到了什么。我确定正在搜索的关键字在这些链接中,因为我也尝试了其他词,但它没有下载它们。

import scrapy

import requests
from scrapy.http import Request

import scrapy
from FinalSpider.items import Page  # Defined in items.py

URL = "http://url.com=%d"
starting_number = 60000
number_of_pages = 100
class FinalSpider(scrapy.Spider):
name = "FinalSpider"
allowed_domains = ['url.com']
start_urls = [URL % starting_number]

def __init__(self):
    self.page_number = starting_number
def start_request(self):
    # generate page IDs from 1000 down to 501
    for i in range (self.page_number, number_of_pages, -1):
        yield Request(url = URL % i, callback=self.parse)


def parse(self, response):
    for link in response.xpath('//a[text()="Amount"]/@href').extract():
        yield Page(url=link)

【问题讨论】:

  • 我不清楚您遇到的确切问题。你能提供一些更具体的细节吗?
  • 是的。我正在尝试结合我在互联网上找到的一些脚本来执行以下任务。转到网站,找到特定的关键字,例如“100”,然后打印/保存找到它的网址。我试图结合网络上的这些脚本来做到这一点,但我一直失败,因为我不懂这种语言。所以,我在这里发布,看看是否有人可以指导我或知道可以做到这一点的代码。从 4 天前开始,我对此感到很沮丧,而且我只完成了我正在从事的项目的 50%。所以我决定在这里寻求帮助。
  • @user5616520,如果你想习惯在scrapy中从网页中提取数据,请使用scrapy shell,在那里你可以交互地播放选择器和XPaths。我强烈建议您也安装Ipython 以获得更友好的体验。
  • 嗨,memoselyk。我将安装 lpython 并对其进行探索,但我不需要提取任何数据本身。我需要的是找到特定的关键字并提取找到它的网址,因为我必须手动检查网址。是的,这是数据提取,但我相信它比提取不同类型的数据要简单得多。但是,到目前为止我不知道如何在我的代码中实现这两个任务..

标签: python xpath web-crawler scrapy


【解决方案1】:

你在这里问两件事,

  1. 如何提取一些元素?

您提供的 xpath response.xpath('//100.00()') 是无效的 xpath 表达式。

如果您想在文本中查找带有一些子字符串的a 标记,例如<a href="something"> 100.00 </a>,则正确的xpath 将是'//a[contains(text(), "100.00")]'。注意contains的使用,如果你有exact文本,你可以使用'//a[text() == "100.00"]'

  1. 找到的元素有什么用?

在 Scrapy 中,通常会创建一个 Item 类来保存您已废弃的数据,这些数据由您定义的 Fields 进行逻辑结构化。

首先,您创建一个Item 子类,其中包含一个url Field,并在您的蜘蛛中,returnyield 一个该Item 的新实例,并设置了字段url到您在页面中找到的值。

把所有这些放在一起,

你要创建一个Item,如图here

import scrapy

class Page(scrapy.Item):
    url = scrapy.Field()

然后,在您的蜘蛛程序中,从 response 对象中提取所有有意义的数据。查看示例here 感受一下。但总的来说,你的代码会是这样的,

import scrapy
from myproject.items import Page  # Defined in items.py

class MySpider(scrapy.Spider):
    [...]

    def parse(self, response):
        for link in response.xpath('//a[text()="100.00"]/@href').extract():
            yield Page(url=link)

【讨论】:

  • 嗨。我有我需要找到的确切文本。它是 100.00,所以我需要使用您建议的“//a[text() == "100.00"]" 吗?但是,我不明白的是我是否在主脚本中实现了这个,以及如何,或者我是否也必须将它放在 items.py 脚本中? 2,我希望找到的元素以 url 的形式保存。因此,例如在 500 个 url 中,如果它在 10 个 url 中找到文本以保存这 10 个 url。这是太多的工作,甚至是可能的,还是在我看来这很复杂,因为我刚刚开始学习这一切。
  • @user5616520,我添加了一些示例代码,试图为您提供一般指南。如果您在解析中遇到困难,请使用 scrapy shell,直到您获得可以简单地复制到 parse 方法的工作代码。
  • 这是我收到@memoselyk,pastebin.com/KsWKEjsB 的错误消息,我无法将其粘贴到这里,你能告诉我我做错了什么吗?我知道模块 myproject.items 不存在。所以这应该是 items.py ,如果我没记错的话。实际上,我认为不应该,因为项目不同。
  • 好的,所以我想,我终于设法让它工作了。好吧,至少我可以在没有任何错误的情况下启动它,但这就是我现在得到的。它不会抓取任何页面。这是粘贴bin链接pastebin.com/SKa5Wh1h
  • 你能看看这里吗? @memoselyk stackoverflow.com/questions/68193300/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 2023-02-26
  • 2021-12-23
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多