Ich benutze Scrapy, um URLs von einer Website zu entfernen. Im Moment gibt es alle URLs zurück, aber ich möchte nur URLs zurückgeben, die das Wort "Download" enthalten. Wie kann ich das machen?Zurückgeben bestimmter URLs nur in scrapy
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request
import scrapy
DOMAIN = 'somedomain.com'
URL = 'http://' +str(DOMAIN)
class MySpider(scrapy.Spider):
name = DOMAIN
allowed_domains = [DOMAIN]
start_urls = [
URL
]
def parse(self, response):
hxs = HtmlXPathSelector(response)
for url in hxs.select('//a/@href').extract():
if not (url.startswith('http://') or url.startswith('https://')):
url= URL + url
print url
yield Request(url, callback=self.parse)
EDIT:
I implementiert die folgenden Vorschläge. Es gibt immer noch einige Fehler, aber zumindest gibt dies nur die Links zurück, die den Download enthalten.
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.http import Request
import scrapy
from scrapy.linkextractors import LinkExtractor
DOMAIN = 'somedomain.com'
URL = 'http://' +str(DOMAIN)
class MySpider(scrapy.Spider):
name = DOMAIN
allowed_domains = [DOMAIN]
start_urls = [
URL
]
# First parse returns all the links of the website and feeds them to parse2
def parse(self, response):
hxs = HtmlXPathSelector(response)
for url in hxs.select('//a/@href').extract():
if not (url.startswith('http://') or url.startswith('https://')):
url= URL + url
yield Request(url, callback=self.parse2)
# Second parse selects only the links that contains download
def parse2(self, response):
le = LinkExtractor(allow=("download"))
for link in le.extract_links(response):
yield Request(url=link.url, callback=self.parse2)
print link.url
Vielen Dank, ich habe es funktioniert, aber auf diese Weise verweigert der Code jeden Link mit "Download", also das ist mindestens auf halbem Weg, aber wie kann ich es umgekehrt tun? – LuukS
überprüfen Sie [LinkExtractor Dokumentation] (https://doc.scrapy.org/en/latest/topics/link-extractors.html), es bietet auch das 'allow' Attribut, so dass Sie eine andere LinkExtractor-Instanz damit erstellen können. – eLRuLL
Probier es einfach, ich bekomme die gleiche Warnung wie mit dot.Py's Antwort: ScrapyDeprecationWarning: Modul 'scrapy.spider' ist veraltet, benutze' scrapy.spiders' statt von scrapy.spider import BaseSpider – LuukS