J'essaie d'utiliser urlparse.urljoin
dans une araignée Scrapy pour compiler une liste d'URL à gratter. Actuellement, mon araignée ne retourne rien, mais ne jette aucune erreur. Donc j'essaie de vérifier que je compile les urls correctement.Scrapy - Est-ce que urlparse.urljoin se comporte de la même manière que str.join?
Ma tentative était de tester ce au ralenti en utilisant str.join
, comme ci-dessous:
>>> href = ['lphs.asp?id=598&city=london',
'lphs.asp?id=480&city=london',
'lphs.asp?id=1808&city=london',
'lphs.asp?id=1662&city=london',
'lphs.asp?id=502&city=london',]
>>> for x in href:
base = "http:/www.url-base.com/destination/"
final_url = str.join(base, x)
print(final_url)
une ligne de ce qui retourne:
lhttp:/www.url-base.com/destination/phttp:/www.url-base.com/destination/hhttp:/www.url-base.com/destination/shttp:/www.url-base.com/destination/.http:/www.url-base.com/destination/ahttp:/www.url-base.com/destination/shttp:/www.url-base.com/destination/phttp:/www.url-base.com/destination/?http:/www.url-base.com/destination/ihttp:/www.url-base.com/destination/dhttp:/www.url-base.com/destination/=http:/www.url-base.com/destination/5http:/www.url-base.com/destination/9http:/www.url-base.com/destination/8http:/www.url-base.com/destination/&http:/www.url-base.com/destination/chttp:/www.url-base.com/destination/ihttp:/www.url-base.com/destination/thttp:/www.url-base.com/destination/yhttp:/www.url-base.com/destination/=http:/www.url-base.com/destination/lhttp:/www.url-base.com/destination/ohttp:/www.url-base.com/destination/nhttp:/www.url-base.com/destination/dhttp:/www.url-base.com/destination/ohttp:/www.url-base.com/destination/n
Je pense que de mon exemple, il est évident que str.join
ne se comporte pas de la même manière - si c'est le cas, voilà pourquoi mon araignée ne suit pas ces liens! - Cependant, il serait bon d'avoir une confirmation à ce sujet.
Si ce n'est pas la bonne façon de tester, comment puis-je tester ce processus?
Mise à jour tentative à l'aide urlparse.urljoin
ci-dessous: d'importation urllib.parse urlparse
>>> from urllib.parse import urlparse
>>> for x in href:
base = "http:/www.url-base.com/destination/"
final_url = urlparse.urljoin(base, x)
print(final_url)
Ce qui jette AttributeError: 'function' object has no attribute 'urljoin'
Mise à jour - la fonction d'araignée en question
def parse_links(self, response):
room_links = response.xpath('//form/table/tr/td/table//a[div]/@href').extract() # insert xpath which contains the href for the rooms
for link in room_links:
base_url = "http://www.example.com/followthrough"
final_url = urlparse.urljoin(base_url, link)
print(final_url)
# This is not joing the final_url right
yield Request(final_url, callback=parse_links)
Mise à jour
Je viens de tester à nouveau au ralenti:
>>> from urllib.parse import urljoin
>>> from urllib import parse
>>> room_links = ['lphs.asp?id=562&city=london',
'lphs.asp?id=1706&city=london',
'lphs.asp?id=1826&city=london',
'lphs.asp?id=541&city=london',
'lphs.asp?id=1672&city=london',
'lphs.asp?id=509&city=london',
'lphs.asp?id=428&city=london',
'lphs.asp?id=614&city=london',
'lphs.asp?id=336&city=london',
'lphs.asp?id=412&city=london',
'lphs.asp?id=611&city=london',]
>>> for link in room_links:
base_url = "http:/www.url-base.com/destination/"
final_url = urlparse.urljoin(base_url, link)
print(final_url)
qui a lancé ceci:
Traceback (most recent call last):
File "<pyshell#34>", line 3, in <module>
final_url = urlparse.urljoin(base_url, link)
AttributeError: 'function' object has no attribute 'urljoin'
Si votre 'room_links' est montrant les choses bien et' base_url' est correctement défini, ça devrait être bien ... Que diriez-vous du reste de votre araignée ... Est-ce que 'parse_links' est appelé correctement et a-t-il vraiment besoin de rapporter avec lui-même? Si quoi que ce soit - s'il commence à crawler, il semble que ça va continuer à ramper et ne céder aucune donnée de toute façon. Avez-vous un 'start_requests' ou' start_urls' défini par exemple? –
@JonClements L'URL de base est correctement définie, si je le prends et ajoute manuellement le href relatif cela fonctionne. J'utilise 'start_urls'rather que' start_requests'. Mais, je ne pense pas que la fonction fonctionne correctement - voir la mise à jour pour ce qui se passe quand je l'exécute en veille? – Maverick