Scrapy的LinkExtractor无法找到网页上的所有链接

os8fio9y  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(179)

目前,我正在尝试编程我自己的网络爬虫真实的地产搜索在维也纳.为此,我使用的CrawlSpider类从Scrapy.我现在发现使用 shell 函数从Scrapy是,LinkExtractor不找到网页上的所有链接.我怎么能解决这个问题?
谢谢jamfleck
PS:如果我的解释缺乏细节,对不起,我是相当新的stackoverflow。

### I open the shell in the anaconda command prompt.
### The url is a overview page of several house listings.
scrapy shell https://www.willhaben.at/iad/immobilien/haus-kaufen/wien 

### Import of the scrapy linkextractor:
from scrapy.linkextractors import LinkExtractor

### I create the linkextractor to search for listings.
### I found out that all listings have a 'd/haus-kaufen/wien' in their url
le = LinkExtractor(allow='d/haus-kaufen/wien')

### Extract all the links:
links = le.extract_links(response)

### Print out the links
for l in links:
    ...:     print(l.url)

输出:

https://www.willhaben.at/iad/immobilien/d/haus-kaufen/wien/wien-1110-simmering/einfamilienhaus-pool-140m2-keller-und-ca-243m2-garten-kamin-fussbodenheizung-2018-2019-eg-saniert-in-wenigen-minuten-simmering-u3-601664118/
https://www.willhaben.at/iad/immobilien/d/haus-kaufen/wien/wien-1220-donaustadt/tausch-reihenhaus-gegen-wohnung-663241383/
https://www.willhaben.at/iad/immobilien/d/haus-kaufen/wien/wien-1170-hernals/knusperhaeuschen-im-gruenen-diverse-obstbaeume-seele-baumeln-lassen-667128712/
https://www.willhaben.at/iad/immobilien/d/haus-kaufen/wien/wien-1130-hietzing/sonniges-einfamilienhaus-aus-familienbesitz-in-1130-wien-667121768/

总共有4个链接出现,但当我在网页上看他们应该更多,约20。

zfciruhq

zfciruhq1#

现代网站通常使用Javascript来动态加载不需要的内容。这提高了初始页面加载,但大多数抓取器无法处理JS,这意味着这些内容对他们来说是不可见的。
你链接的网站正是这样做的。如果你用像NoScript这样的Javascript拦截器访问页面,只有前4-5个帖子是可见的,因为其余的帖子会通过Javascript获取。
Scrapy's website has a writeup about workarounds for this issue
关于这个特定站点的有趣的事情是,他们实际上在初始请求中获取了所有条目,并且之后只使用JS来构建UI。
您可以在原始网站HTML中看到它:

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "ItemList",
    "itemListElement": [
        {
            "@type": "ListItem",
            "position": 0,
            "url": "/iad/immobilien/d/haus-kaufen/wien/wien-1110-simmering/kleingarten-in-simmering-667272230/"
        },
        ...
    ],
    "numberOfItems": 1236,
    "name": "Haus kaufen in Wien - willhaben",
    "description": "Haus kaufen oder verkaufen in Wien, finden Sie Ihr Einfamilienhaus, Reihenhaus unter 13.382 Häusern auf willhaben"
}
</script>

因此,在这个特定的例子中,您可以提取HTML中包含的这个JSON对象来获得搜索请求的结果。
可能的XPath://*[@id="skip-to-content"]/div/script
希望有帮助!

相关问题