Heim >Backend-Entwicklung >Python-Tutorial >Praktischer Einsatz des Crawler-Frameworks Scrapy zur stapelweisen Erfassung von Rekrutierungsinformationen
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:Ziel: Informationen zur Stellenbeschaffung von der offiziellen Tencent-Rekrutierungswebsite abrufen und Speichern Sie es im JSON-Format.
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
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 requestPipeLine 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 tencentEin 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"] 🎜>