蜘蛛没有抓取适量的物品

Spider not scraping the right amount of items

这两天一直在学习Scrapy,获取页面上的所有列表元素都遇到了问题

因此该页面具有类似如下的结构:

<ol class="list-results">
    <li class="SomeClass i">
        <ul>
            <li class="name">Name1</li>
        </ul>
    </li>
    <li class="SomeClass 0">
        <ul>
            <li class="name">Name2</li>
        </ul>
    </li>
    <li class="SomeClass i">
        <ul>
            <li class="name">Name3/li>
        </ul>
    </li>
</ol>

在Scrapy的Parse函数中,我得到的所有列表元素都是这样的:

def parse(self, response):
        sel = Selector(response)
        all_elements = sel.css('.SomeClass')
        print len(all_elemts)

我知道在我请求的测试页上有 大约 300 个带有 class 的列表元素,但是在打印 len(all_elements ), 我只得到 61.

我试过使用像这样的 xpaths:

sel.xpath("//*[contains(concat(' ', @class, ' '), 'SomeClass')]")

但我仍然得到了 61 个元素,而不是我应该得到的 300 个元素。

此外,我正在使用 try and except claws 以防某个元素给我例外。

这是我要抓取的实际页面: https://search.msu.edu/people/index.php?fst=ab&lst=&nid=&filter=

请理解,我这样做只是为了练习!

请帮忙!谢谢!我只是不知道还能做什么!

恐怕你正在处理一个格式不正确且损坏的HTML,Scrapy(和底层lxml)无法解析可靠地。例如,在 li 标签内看到这个未闭合的 div

<li class="unit"><span>Unit:</span> 
    <div class="unit-block"> Language Program                  
</li>

我会切换到使用 BeautifulSoup 手动解析 HTML。换句话说,继续使用Scrapy框架的所有其他部分和组件,但HTML-解析部分留给BeautifulSoup.

来自 scrapy shell 的演示:

$ scrapy shell "https://search.msu.edu/people/index.php?fst=ab&lst=&nid=&filter="
In [1]: len(response.css('li.student'))
Out[1]: 55

In [2]: from bs4 import BeautifulSoup

In [3]: soup = BeautifulSoup(response.body)

In [4]: len(soup.select('li.student'))
Out[4]: 281

如果您正在使用 CrawlSpider 并且需要基于 BeautifulSoupLinkExtractor,请参阅: