Hy all,
我有一个奇怪的问题。
似乎Scrapy没有从页面中提取所有现有的URL。即它找到/提取在这种类型的标签上找到的URL:
<a href="https://www.mysite.com/members/foreign-members" class="..." title="">
Foreign members
</a>
但它没有找到/提取此类标记上的网址:
<a class="..." style="..." href="https://www.mysite.com/members/members/8199" title="...">
...
<span title="...">...</span>
</a>
可能是什么问题? 因为href属性不是第一个?我注意到,当href不是第一个属性时,它找不到URL。就像你看到的那样,我没有任何正则表达式来定义要提取的URL,所以它应该提取所有这些URL。
以下是我的蜘蛛代码示例:
class MySpider(CrawlSpider):
name = 'S'
start_urls = ['https://www.mysite.com/members/members/']
rules = (
Rule(SgmlLinkExtractor(), callback = 'parse_members'),
)
...
有人有解决方案吗?
提前谢谢!
答案 0 :(得分:0)
我用firebug查看你分享的链接,打开'net'部分并意识到这是你想要的链接:
$ scrapy shell "https://www.knaw.nl/en/members/members/@@faceted_query?b_start[]=0&version=cb403bd0d9fed8ab5ee81b142c8d1f9a"
...
>>> sel.xpath('//a/@href').extract()
[u'https://www.knaw.nl/en/members/members/8199',
u'https://www.knaw.nl/en/members/members/8199',
u'https://www.knaw.nl/en/members/members/3786',
u'https://www.knaw.nl/en/members/members/3786',
...]
这可以在蜘蛛中使用:
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
class MySpider(BaseSpider):
...
start_urls = ['https://www.knaw.nl/en/members/members/@@faceted_query?b_start[]=0&version=cb403bd0d9fed8ab5ee81b142c8d1f9a']
def parse(self, response):
sel = Selector(response)
for link in sel.xpath('').extract():
yield Request(url=link, callback=self.some_function_to _extract_page)
使用此网址,您还可以将CrawlSpider与SgmlLinkExtractor一起使用:
>>> from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
>>> SgmlLinkExtractor().extract_links(response)
[Link(url='https://www.knaw.nl/en/members/members/8199', .....]
作为附注,注意链接看起来是相同的两次,你可以尝试提取它们一次让scrapy过滤它们,它自动完成,所以在默认情况下,scrapy不会刮两次。