python-避免由于相对网址而导致的错误请求
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-避免由于相对网址而导致的错误请求,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2647字,纯文字阅读大概需要4分钟。
内容图文
![python-避免由于相对网址而导致的错误请求](/upload/InfoBanner/zyjiaocheng/659/6aab4b2e4ac142db86dd68793b1729f9.jpg)
我正在尝试使用Scrapy抓取网站,并且我要抓取的每个页面的网址都使用此类相对路径编写:
<!-- on page https://www.domain-name.com/en/somelist.html (no <base> in the <head>) -->
<a href="../../en/item-to-scrap.html">Link</a>
现在,在我的浏览器中,这些链接有效,并且您到达的URL类似于https://www.domain-name.com/en/item-to-scrap.html(尽管相对路径在层次结构中返回两次而不是一次)
但是我的CrawlSpider无法将这些网址转换为“正确的”网址,而我得到的只是该类错误:
2013-10-13 09:30:41-0500 [domain-name.com] DEBUG: Retrying <GET https://www.domain-name.com/../en/item-to-scrap.html> (failed 1 times): 400 Bad Request
有没有办法解决这个问题,还是我错过了什么?
这是我的蜘蛛程序的代码,相当基本(基于与“ /en/item-*-scrap.html”匹配的项目网址):
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field
class Product(Item):
name = Field()
class siteSpider(CrawlSpider):
name = "domain-name.com"
allowed_domains = ['www.domain-name.com']
start_urls = ["https://www.domain-name.com/en/"]
rules = (
Rule(SgmlLinkExtractor(allow=('\/en\/item\-[a-z0-9\-]+\-scrap\.html')), callback='parse_item', follow=True),
Rule(SgmlLinkExtractor(allow=('')), follow=True),
)
def parse_item(self, response):
x = HtmlXPathSelector(response)
product = Product()
product['name'] = ''
name = x.select('//title/text()').extract()
if type(name) is list:
for s in name:
if s != ' ' and s != '':
product['name'] = s
break
return product
解决方法:
基本上来说,scrapy使用http://docs.python.org/2/library/urlparse.html#urlparse.urljoin通过连接scraped的currenturl和url链接来获取下一个URL.如果您加入您提供的网址作为示例,
<!-- on page https://www.domain-name.com/en/somelist.html -->
<a href="../../en/item-to-scrap.html">Link</a>
返回的网址与error scrapy error中提到的网址相同.在python shell中尝试一下.
import urlparse
urlparse.urljoin("https://www.domain-name.com/en/somelist.html","../../en/item-to-scrap.html")
urljoin行为似乎是有效的.参见:http://tools.ietf.org/html/rfc1808.html#section-5.2
如果可能,您可以通过正在爬网的网站吗?
有了这些了解,解决方案可以是,
1)处理网址(删除这两个点并加斜杠).在爬行蜘蛛中生成.基本上覆盖解析或_request_to_folow.
爬行蜘蛛的来源:https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/spiders/crawl.py
2)在downloadmiddleware中操纵url,这可能更干净.您可以在下载中间件的process_request中删除../.
用于下载中间件的文档:http://scrapy.readthedocs.org/en/0.16/topics/downloader-middleware.html
3)使用基本Spider,并返回您要进一步抓取的操纵的url请求
basespider的文档:http://scrapy.readthedocs.org/en/0.16/topics/spiders.html#basespider
请让我知道,如果你有任何问题.
内容总结
以上是互联网集市为您收集整理的python-避免由于相对网址而导致的错误请求全部内容,希望文章能够帮你解决python-避免由于相对网址而导致的错误请求所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。