我试图在Scrapy蜘蛛中使用urlparse.urljoin
来编译一个url列表。目前,我的蜘蛛没有返回,但没有发现任何错误。所以我试图检查我是否正确地编译了这些URL。Scrapy - urlparse.urljoin的行为方式与str.join相同吗?
我的尝试是使用str.join
在闲置测试,如下图所示:
>>> 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)
的返回什么一个行:
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
我认为,从我的例子是很明显,str.join
不会以相同的方式表现 - 如果确实如此,那么这就是为什么我的蜘蛛没有遵循这些链接! - 但是,对此有确认是很好的。
如果这不是正确的测试方法,我该如何测试这个过程?
更新使用以下urlparse.urljoin
尝试: 从进口的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)
这是投掷AttributeError: 'function' object has no attribute 'urljoin'
更新 - 相关
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)
蜘蛛功能
更新
我只是再次测试空闲:
>>> 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)
其中抛出此:
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'
如果你的'room_links'正显示出好的东西和'base_url'设置正确,然后那应该没问题......你的蜘蛛的其余部分是怎么样的......是否正确调用了parse_links,它是否真的需要自己产生一个回调?如果有的话 - 如果它开始爬行,它看起来会继续爬行并且不会产生任何数据。您是否有例如定义的'start_requests'或'start_urls'? –
@JonClements基本URL设置正确,如果我拿它并手动添加相对href它工作。我使用'start_urls'而不是'start_requests'。但是,我不认为该功能正常工作 - 请参阅更新以了解当我在闲置状态下运行时会发生什么情况? – Maverick