从主页面中提取的新页面中提取文本

时间:2013-12-04 14:14:12

标签: python web-crawler extract scrapy permalinks

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

此抓取工具用于从“主页”获取所有te链接,然后抓取所有这些链接并从中获取文本。

我希望你理解我的意思,如果不是问我那么我会尝试解释更详细的

编辑:

所以我阅读了更多关于 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()

2 个答案:

答案 0 :(得分:2)

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

然后,scrapy负责将项目发送到pipelines并称之为“请求”

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

最后,scrapy会跟踪请求并确保不会多次调用这些请求,除非您在请求中设置dont_filter=True

答案 1 :(得分:1)

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。您必须将其翻译为较低版本,但可以轻松阅读文档。