Heim >Backend-Entwicklung >Python-Tutorial >Praktischer Einsatz des Crawler-Frameworks Scrapy zur stapelweisen Erfassung von Rekrutierungsinformationen

Praktischer Einsatz des Crawler-Frameworks Scrapy zur stapelweisen Erfassung von Rekrutierungsinformationen

高洛峰
高洛峰Original
2016-10-17 13:49:341105Durchsuche

Der sogenannte Webcrawler ist ein Programm, das Daten überall oder in eine bestimmte Richtung im Internet crawlt. Diese Aussage ist natürlich nicht professionell genug, um die HTML-Daten bestimmter Website-Seiten zu crawlen. Da eine Website jedoch über viele Webseiten verfügt und es für uns unmöglich ist, die URL-Adressen aller Webseiten im Voraus zu kennen, muss untersucht werden, wie wir sicherstellen können, dass wir alle HTML-Seiten der Website erfassen. Die allgemeine Methode besteht darin, eine Einstiegsseite zu definieren. Anschließend enthält eine Seite im Allgemeinen die URLs anderer Seiten. Diese URLs werden also von der aktuellen Seite abgerufen und zur Crawling-Warteschlange des Crawlers hinzugefügt. Nach dem Aufrufen der neuen Seite werden die oben genannten Schritte ausgeführt wird rekursiv ausgeführt. Die Operation ist tatsächlich dieselbe wie die Tiefendurchquerung oder Breitendurchquerung.

Scrapy ist ein Crawler-Framework, das auf Twisted basiert und in reinem Python implementiert ist. Benutzer müssen nur ein paar Module anpassen und entwickeln, um einen Crawler zum Crawlen von Webinhalten und verschiedenen Bildern zu implementieren >

Scrapy nutzt Twisted, eine asynchrone Netzwerkbibliothek, um die Netzwerkkommunikation abzuwickeln. Sie verfügt über eine klare Architektur und enthält verschiedene Middleware-Schnittstellen, die verschiedene Anforderungen flexibel erfüllen können. Die Gesamtarchitektur ist in der folgenden Abbildung dargestellt:

Praktischer Einsatz des Crawler-Frameworks Scrapy zur stapelweisen Erfassung von Rekrutierungsinformationen

Die grüne Linie ist die Datenflussrichtung, beginnend mit der ursprünglichen URL, die der Scheduler zum Herunterladen an den Downloader weitergibt , und übergeben Sie es dann nach dem Herunterladen an Spider. Zur Analyse werden von Spider zwei Arten von Ergebnissen analysiert: Zum einen müssen die Links weiter gecrawlt werden, z. B. der zuvor analysierte Link „Nächste Seite“. Das andere sind die Daten, die gespeichert werden müssen. Sie werden an die Item-Pipeline gesendet, wo die Daten nachbearbeitet werden (detaillierte Analyse, Filterung, Speicherung usw.). Darüber hinaus können im Datenflusskanal verschiedene Middleware installiert werden, um die erforderliche Verarbeitung durchzuführen.


Ich gehe davon aus, dass Sie Scrapy bereits installiert haben. Wenn Sie es nicht installiert haben, können Sie diesen Artikel lesen.

In diesem Artikel erfahren Sie, wie Sie mit Scrapy ein Crawler-Programm erstellen und Inhalte auf bestimmten Websites crawlen

1. Definieren das Element Item, das Sie aus der Webseite extrahieren müssen

3. Implementieren Sie eine Spider-Klasse, um die Funktion des Crawlens von URLs und des Extrahierens von Elementen über die Schnittstelle abzuschließen

4. Implementieren Sie eine Item-PipeLine-Klasse und vollständige Artikelspeicherfunktion

Ich werde die offizielle Website der Tencent-Rekrutierung als Beispiel verwenden.

Github-Quellcode: https://github.com/maxliaops/scrapy-itzhaopin

Ziel: Informationen zur Stellenbeschaffung von der offiziellen Tencent-Rekrutierungswebsite abrufen und Speichern Sie es im JSON-Format. Praktischer Einsatz des Crawler-Frameworks Scrapy zur stapelweisen Erfassung von Rekrutierungsinformationen

Neues Projekt

Erstellen Sie zunächst ein neues Projekt für unseren Crawler, geben Sie zunächst ein Verzeichnis ein (jedes Verzeichnis, das wir zum Speichern von Code verwenden) und führen Sie Folgendes aus:

scrapy startprojectitzhaopin

Der letzte Itzhaopin ist der Projektname. Dieser Befehl erstellt ein neues Verzeichnis itzhaopin im aktuellen Verzeichnis mit der folgenden Struktur:

.

├── itzhaopin

│ ├── itzhaopin

│ │ ├── __init__.py

│ │ ├── items.py

│ │ ├──pipelines.py

│ │. ├── Einstellungen .py

│ │ └── Spiders

│ │ └── __init__.py

│ └── scrapy.cfg

scrapy.cfg: Projektkonfigurationsdatei

items.py: Datenstruktur-Definitionsdatei, die extrahiert werden muss

pipelines.py: Pipeline-Definition, die zur weiteren Verarbeitung der extrahierten Daten verwendet wird Elemente. Wie Speichern usw.

settings.py: Crawler-Konfigurationsdatei

Spiders: Verzeichnis, in dem Spider platziert werden

definieren Item

Definieren Sie die Daten, die wir in items.py crawlen möchten:

Implementing Spider

from scrapy.item import Item, Field
class TencentItem(Item):
    name = Field()                # 职位名称
    catalog = Field()             # 职位类别
    workLocation = Field()        # 工作地点
    recruitNumber = Field()       # 招聘人数
    detailLink = Field()          # 职位详情页链接
    publishTime = Field()         # 发布时间
Spider ist eine Python-Klasse, die von scrapy.contrib.spiders.CrawlSpider geerbt wurde . Es sind drei erforderlich. Die definierten Mitglieder

name: Name, die Kennung dieser Spinne

start_urls: eine Liste von URLs, die Spinne beginnt mit dem Crawlen von diesen Webseiten

parse(): eine Methode. Wenn die Webseite in start_urls gecrawlt wird, müssen Sie diese Methode aufrufen, um den Webseiteninhalt zu analysieren. Gleichzeitig müssen Sie die nächste zu crawlende Webseite oder die Elemente zurückgeben Liste

, also erstellen Sie einen neuen Spider im Spider-Verzeichnis, tencent_spider.py :

PipeLine implementieren

import re
import json
from scrapy.selector import Selector
try:
    from scrapy.spider import Spider
except:
    from scrapy.spider import BaseSpider as Spider
from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as sle
from itzhaopin.items import *
from itzhaopin.misc.log import *
class TencentSpider(CrawlSpider):
    name = "tencent"
    allowed_domains = ["tencent.com"]
    start_urls = [
        "http://hr.tencent.com/position.php"
    ]
    rules = [ # 定义爬取URL的规则
        Rule(sle(allow=("/position.php\?&start=\d{,4}#a")), follow=True, callback='parse_item')
    ]
    def parse_item(self, response): # 提取数据到Items里面,主要用到XPath和CSS选择器提取网页数据
        items = []
        sel = Selector(response)
        base_url = get_base_url(response)
        sites_even = sel.css('table.tablelist tr.even')
        for site in sites_even:
            item = TencentItem()
            item['name'] = site.css('.l.square a').xpath('text()').extract()
            relative_url = site.css('.l.square a').xpath('@href').extract()[0]
            item['detailLink'] = urljoin_rfc(base_url, relative_url)
            item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()
            item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()
            item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()
            item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()
            items.append(item)
            #print repr(item).decode("unicode-escape") + '\n'
        sites_odd = sel.css('table.tablelist tr.odd')
        for site in sites_odd:
            item = TencentItem()
            item['name'] = site.css('.l.square a').xpath('text()').extract()
            relative_url = site.css('.l.square a').xpath('@href').extract()[0]
            item['detailLink'] = urljoin_rfc(base_url, relative_url)
            item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()
            item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()
            item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()
            item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()
            items.append(item)
            #print repr(item).decode("unicode-escape") + '\n'
        info('parsed ' + str(response))
        return items
    def _process_request(self, request):
        info('process ' + str(request))
        return request
PipeLine wird zum Speichern der von Spider zurückgegebenen Artikelliste verwendet und kann in eine Datei, Datenbank usw. geschrieben werden.

PipeLine hat nur eine Methode, die implementiert werden muss: process_item. Beispielsweise speichern wir Item in einer JSON-Formatdatei:

pipelines.py

Up Bis jetzt haben wir Nach Abschluss der Implementierung eines Basis-Crawlers können Sie den folgenden Befehl eingeben, um den Spider zu starten:

from scrapy import signals
import json
import codecs
class JsonWithEncodingTencentPipeline(object):
    def __init__(self):
        self.file = codecs.open('tencent.json', 'w', encoding='utf-8')
    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line)
        return item
    def spider_closed(self, spider):
        self.file.close(
)

Nachdem der Crawler ausgeführt wurde, wird eine Datei mit dem Namen tencent.json im generiert aktuelles Verzeichnis, in dem Stellenbesetzungsinformationen im JSON-Format gespeichert werden.

scrapy crawl tencent
Ein Teil des Inhalts ist wie folgt:

{"recruitNumber": ["1"], "name": ["SD5-Senior Mobile Game Planning (Shenzhen)"], "detailLink": "http://hr.tencent.com/position_detail.php ?id=15626&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Product/Project Category"], "workLocation": ["Shenzhen"]}

{"recruitNumber": ["1"], "name": ["TEG13-Backend Development Engineer (Shenzhen)"], "detailLink": "http://hr.tencent.com/position_detail. php?id=15666&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Technology"], "workLocation": ["Shenzhen"]}

{"recruitNumber": ["2"], "name": ["TEG12-Data Center Senior Manager (Shenzhen)"], "detailLink": "http://hr.tencent.com/position_detail. php ?id=15698&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Technology"], "workLocation": ["Shenzhen"]}

{"recruitNumber": ["1"], "name": ["GY1-WeChat Payment Brand Planning Manager (Shenzhen)"], "detailLink": "http://hr.tencent.com/position_detail .php ?id=15710&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Market Class"], "workLocation": ["Shenzhen"]}

{"recruitNumber": ["2"], "name": ["SNG06-Backend Development Engineer (Shenzhen)"], "detailLink": "http://hr.tencent.com/position_detail. php? id=15499&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Technology"], "workLocation": ["Shenzhen"]}

{"recruitNumber": ["2"], "name": ["OMG01-Tencent Fashion Video Planning Editor (Beijing)"], "detailLink": "http://hr.tencent.com/position_detail .php? id=15694&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Content Editing Class"], "workLocation": ["Beijing"]}

{"recruitNumber": ["1"], "name": ["HY08-QT Client Windows Development Engineer (Shenzhen)"], "detailLink": "http://hr.tencent.com/position_detail. php?id=11378&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Technology"], "workLocation": ["Shenzhen" ]}

{"recruitNumber": ["5"], "name": ["HY1-Mobile Game Test Manager (Shanghai)"], "detailLink": "http://hr.tencent.com/position_detail.php ?id=15607&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Technical Category"], "workLocation": ["Shanghai" ]}

{"recruitNumber": ["1"], "name": ["HY6-Internet Cafe Platform Senior Product Manager (Shenzhen)"], "detailLink": "http://hr.tencent .com/position_detail .php?id=10974&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["Product/Project Class"], "workLocation": [ "Shenzhen"] }

{"recruitNumber": ["4"], "name": ["TEG14-Cloud Storage R&D Engineer (Shenzhen)"], "detailLink": "http://hr .tencent.com /position_detail.php?id=15168&keywords=&tid=0&lid=0", "publishTime": ["24.04.2014"], "catalog": ["Technische Kategorie"], "workLocation": [ "Shenzhen"] }

{"recruitNumber": ["1"], "name": ["CB-Compensation Manager (Shenzhen)"], "detailLink": "http://hr.tencent .com/position_detail .php?id=2309&keywords=&tid=0&lid=0", "publishTime": ["28.11.2013"], "catalog": ["Functional Class"], "workLocation": ["Shenzhen"] 🎜>


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn