蜘蛛没有抓取适量的物品
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
并且需要基于 BeautifulSoup
的 LinkExtractor
,请参阅:
这两天一直在学习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
并且需要基于 BeautifulSoup
的 LinkExtractor
,请参阅: