【问题标题】:Extract text from an extracted new page from main page从主页提取的新页面中提取文本
【发布时间】:2013-12-04 14:14:11
【问题描述】:

我正在尝试从我从“主页”中提取的提取链接中获取文本

这个爬虫应该从“主页”获取所有链接,然后爬取所有这些链接并从中获取文本。

我希望你明白我的意思,如果不问我,我试着解释得更详细

编辑:

所以我阅读了更多关于 scrapy 的内容并找到了这个页面https://scrapy.readthedocs.org/en/latest/topics/spiders.html?highlight=crawlspider#crawling-rules 我阅读了“SitemapSpider”,我想这可能是我需要用于此问题的蜘蛛

蜘蛛文件 *已编辑*

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from craigslist_randstad.items import CraigslistRandstadItem

class MySpider(BaseSpider):
    name = "craig"
    allowed_domains = ["randstad.nl"]
    start_urls = ["http://www.randstad.nl/mwp2/faces/baanZoeken?afstand=10&pagina=1&_adf.ctrl-state=sb0riset7_4&sc=0&filters=vakgebied!5626&_afrLoop="]

def parse(self, response):
    sel = Selector(response)
    link = 

    for link in sel.xpath("//div[@class='search-result af_panelGroupLayout']"):
        link = sel.xpath(".//a[contains(@class, 'outer-read-more-link')]/@href").extract()
        yield Request(link, callback=self.parse)

    print len(link)


    text_list = sel.xpath('//div[@id="basePage:page:twoColumn:r2:0:functieOmschrijvingPanel::content"]/text()').extract()
    if text_list:
        text = '\n'.join(text_list)
        item = CraigItem()
        item['link'] = response.url
        item['title'] = text
        yield item

项目文件

from scrapy.item import Item, Field

class CraigslistRandstadItem(Item):
  title = Field()
  link = Field()

【问题讨论】:

  • 如果我理解正确,您应该从 url 开始的yield 请求和第二个请求中的yield 项目。您在哪里指明要提取哪些文本?
  • 首先我还不熟悉所有的 scrapy 术语。我读了这个link 来更好地理解你。但是为了更容易解释,首先我得到了“主页”,其中有很多href。所有这些 href 都有自己独特的 url,并且在该 url 中都有自己的文本。然后,当我提取文本时,我将其放入 xml/json 文件中,然后我可以将关键字与其他关键字进行比较。所以我现在想知道的是,我如何访问我提取的所有这些独特页面以及如何从页面中获取内容

标签: python web-crawler extract scrapy permalinks


【解决方案1】:

从默认的parse() 函数开始,每个蜘蛛函数都可以产生一些Item/s 和/或Request/s 的组合,请注意,如果你想返回多个项目/请求,你必须yield而不是return

scrapy 然后负责将项目发送到pipelines 并调用这些请求

注意创建请求时应该给出的callback参数,这是scrapy将调用响应的函数。

最后,scrapy 会跟踪请求,并确保它们不会被多次调用,除非您在请求上设置 dont_filter=True

【讨论】:

  • 谢谢你这个简短而清晰的解释,现在我知道我需要搜索这个脚本以及使用什么。
【解决方案2】:

Guy给了你一个很好的解释,下面是一个提取一些数据的例子,可以指导你进行更复杂的报废:

首先,创建项目并访问其目录:

scrapy startproject craig && cd craig

其次,编辑文件items.py

from scrapy.item import Item, Field

class CraigItem(Item):
    title = Field()
    link = Field()

第三,创建蜘蛛。你可以用最基本的一项来完成这个简单的任务:

scrapy genspider -t basic craig_spider 'randstad.nl'

第四,编辑它,spiders/craig_spider.py

from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from craig.items import CraigItem
from scrapy.http import Request

class CraigSpiderSpider(BaseSpider):
    name = "craig_spider"
    allowed_domains = ["randstad.nl"]
    start_urls = ( 
        "http://www.randstad.nl/mwp2/faces/baanZoeken?afstand=10&pagina=1&_adf.ctrl-state=sb0riset7_4&sc=0&filters=vakgebied!5626&_afrLoop=",
        )   

    def parse(self, response):
        sel = Selector(response)

        for link in sel.xpath("//a[contains(@class, 'outer-read-more-link')]/@href").extract():
            yield Request(link, callback=self.parse)

        text_list = sel.xpath('//div[@id="basePage:page:twoColumn:r2:0:functieOmschrijvingPanel::content"]/text()').extract()
        if text_list:
            text = '\n'.join(text_list)
            item = CraigItem()
            item['link'] = response.url
            item['title'] = text
            yield item

注意这样做

links = hxs.select("//div[@class='search-result af_panelGroupLayout']")

提取链接及以后

links.select("//a[contains(@class, 'outer-read-more-link')]/@href")

没有什么意义,因为//a[...] 会从根元素而不是links 子树中搜索所有锚点,所以我在这里省略了第一次搜索。

还请注意,我进行了两种不同的xpath 搜索,一种返回 (yield) 链接以再次解析 (callback),另一种在信息页面中提取整个文本,创建项目并返回它。

像这样运行它:

scrapy crawl craig_spider -o craig.json -t json

这将创建一个json 格式的文本文件,如下所示:

[{"link": "http://www.randstad.nl/vacatures/1486457/klantadviseur-glasvezel-tijdelijk-%28m-v%29", "title": "Wil je per direct aan de slag in een afwisselend project?  Heb jij ervaring in de glasvezel- of ICT-branche? Werk jij graag in een hectische, dynamische omgeving?\nDan hebben wij een leuke tijdelijke baan voor jou! \nDeze snelgroeiende en onafhankelijke serviceprovider levert een breed scala aan diensten zoals internet, televisie en telefonie op het glasvezelnetwerk . \nIn deze veelzijdige functie ben je verantwoordelijk voor een zo positief mogelijke klantbeleving. Je zorgt voor een proactieve, deskundige advisering aan klanten over diensten en de levering ervan. Je bent verantwoordelijk voor de Backoffice Support van het Klant Contact Center, je denkt actief mee over verbeteringen in communicatie, applicaties en de manier van werken binnen het bedrijf. Je ziet kansen in alle dagelijkse handelingen om de commercie te verhogen op de afdeling.\nWat ga je doen?\nBeantwoorden van tweede- en derdelijns vragen van klanten en externe partners, \nBewaken van procedures voor correcte administratieve afhandeling,\nVerwerken van orders en uitsturen hiervan per post en e-mail,\nBijdragen aan optimaliseren primaire klantprocessen.\nWie ben jij?\nJe hebt een opleiding afgerond op MBO+/HBO niveau, of bent studerend aan HBO of WO,\nMinimaal 1 jaar inbound contactcenterervaring,\nJe hebt een perfecte beheersing van de Nederlandse taal in woord en geschrift,\nErvaring met het Office pakket,\nWerkervaring in glasvezel- en/of ICT-branche is een grote pr\u00e9\nVerder ben je:\nBetrokken, betrouwbaar, transparant en innovatief,\nZelfstandig,\nKlantgericht en commercieel,\nJe vindt het leuk om klanten te enthousiasmeren,\nJe bent een oplossingsgerichte teamspeler en je hebt affiniteit met ICT.\nZie jij jezelf als de perfecte kandidaat voor deze baan? Dan horen we graag vandaag nog van je! Reageer direct via de solliciteer button met je Cv en vertel ons waarom jij de geschikte kandidaat bent voor deze functie!"},
{"link": "http://www.randstad.nl/vacatures/1360086/embedded-software-design-engineer-electric-controls-%28m-v%29", "title": "Ben jij degene die nieuwe dingen bedenkt? Doe je dat het liefst in een team van specialisten? En vind je het leuk bezig te zijn in het werkveld van elektrische installaties voor (railgebonden) voertuigen? lees dan snel verder...\nWat ga jij doen?\nOpstellen van systeem-, product- en module specificaties conform bestek, normen en voorschriften\nHet opstellen van softwarespecificaties en het ontwerp van de software\nFormuleren en uitvoeren van testplannen voor afname beproevingen\nRisicomanagement door toepassing van FMEA en FTA\nOpstellen van ontwerp- en gebruikers documentatie\nRapporteren aan de projectleider\n \nWat verwachten wij van jou?\nMinimaal een HBO-opleiding (Bij voorkeur WO), richting elektrotechniek, embedded systems of gelijkwaardig vakgebied\nRelevante ervaring met het toepassen van normen en richtlijnen voor kwaliteit en veiligheid\nUitstekende communicatieve vaardigheden\nSterk ontwikkeld analytisch denkvermogen\nUitstekende beheersing van de Engels en Nederlandse taal is noodzakelijk\nKennis van en ervaring met elektrische installaties voor railgebonden voertuigen\nKennis van en ervaring met CAN, MVB, C/C++, .NET/C#, FPGA, real-time OS, TCMS, CMMI, EN61508 SIL3, EN50128, FMEA en Matlab/Simulink\nHerken jij jezelf in dit profiel en heb jeinmiddels een aantal jaar werkervaring in jouw vakgebied? Ben jij toe aan de volgende stap in je carriere reageer dan snel via 06-15087716 of mail bas.kooter.rnl@nl.randstad.com"},
...
]

最后说明:此示例使用 0.20 版本的 完成。它更改了用于提取数据的类。现在它被称为Selector。您必须将其翻译为较低版本,但阅读文档很容易。

【讨论】:

  • 感谢Birei提供了一个很好的详细示例,我会尝试一下,如果我在创建过程中遇到任何问题,请告诉您
  • Birei 效果很好!确实,正如您提到的//a[..] 一样,这是真的,但为了摆脱这个问题,我需要在a 的蜘蛛搜索开始之前将这个sel.xpath("//div[@class='search-result af_panelGroupLayout']") 放在任何想法我可以在哪里/如何放置这个检查?
  • 这在我的第一个测试中帮助了我:sel = Selector(response) sites = sel.xpath("//div[@class='search-result af_panelGroupLayout']") Start For Loop for site in sites: link = sites.xpath("//a[contains(@class, 'outer-read-more-link')]/@href").extract() 所以我的问题是我该如何放置 sel.xpath 在您的示例中 for 循环,然后请求 sites.xpath
  • @Beer:明确添加它以从当前节点开始:links.select(".//a[contains(@class, 'outer-read-more-link')]/@href").extract()(注意 . 作为第一个字符)。
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 2020-05-17
  • 2020-05-07
  • 1970-01-01
相关资源
最近更新 更多