如何从无限滚动的网站中抓取所有内容?scrapy
如何从无限滚动的网站中抓取所有内容?scrapy
我正在使用Scrapy。
我使用的网站具有无限滚动功能。
这个网站有很多帖子,但我只爬取了13个。
如何爬取剩下的帖子?
这是我的代码:
class exampleSpider(scrapy.Spider): name = "example" allowed_domains = ["example.com"] start_urls = [ "http://www.example.com/somethinghere/" ] def parse(self, response): for href in response.xpath("//*[@id='page-wrap']/div/div/div/section[2]/div/div/div/div[3]/ul/li/div/h1/a/@href"): url = response.urljoin(href.extract()) yield scrapy.Request(url, callback=self.parse_dir_contents) def parse_dir_contents(self, response): #在这里添加爬取内容的代码
从这段内容中,我们可以得出以下结论:
- infinite scroll网站通常使用分页逻辑来加载内容。
- 当滚动到页面的3/4处或者滚动到页面底部时,页面会触发AJAX请求,并下载下一页的内容,然后将响应加载到当前页面中。
- 推荐使用Firefox的网络监视工具来观察滚动时是否有相关的页面请求。
- 在实现这个解决方案时,建议使用scrapy的FormRequest或FormRequest.from_response方法。
据此,可以整理出如下文章:
如何从无限滚动的网站中爬取所有内容(使用Scrapy)
无限滚动网站通常会使用分页逻辑来加载内容。当滚动到页面的3/4处或者滚动到页面底部时,页面会触发AJAX请求,下载下一页的内容,并将响应加载到当前页面中。本文将介绍如何使用Scrapy来解决这个问题。
首先,我们可以使用Firefox的网络监视工具来观察在滚动时是否有相关的页面请求。通过观察这些请求,我们可以得到一些线索。在实现解决方案时,我们可以使用scrapy的FormRequest或FormRequest.from_response方法。
下面是一个使用FormRequest的示例代码:
import scrapy from scrapy.http import FormRequest class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['http://example.com'] def parse(self, response): # 解析初始页面的内容 # 构造下一页的请求 formdata = { # 根据观察到的请求参数填充formdata } yield FormRequest(url='http://example.com/next_page', formdata=formdata, callback=self.parse_next_page) def parse_next_page(self, response): # 解析下一页的内容 # 继续构造下一页的请求,以实现无限滚动 formdata = { # 根据观察到的请求参数填充formdata } yield FormRequest(url='http://example.com/next_page', formdata=formdata, callback=self.parse_next_page)
通过使用FormRequest或FormRequest.from_response方法,我们可以模拟页面的AJAX请求,并获取到下一页的内容。这样,我们就能够从无限滚动的网站中爬取到所有的内容了。
希望本文对于解决从无限滚动的网站中爬取所有内容的问题有所帮助。
问题:如何从无限滚动的网站上爬取所有内容?
原因:无限滚动网站的内容是通过JavaScript动态加载的,传统的网页爬取方法无法获取到所有内容。
解决方法:
1. 查看网站代码,确定无限滚动是通过自动触发JavaScript操作实现的。
2. 使用Spynner库,按照其文档的指引,可以找到触发jQuery事件的方法。
3. 尝试生成“滚动到底部”事件或对滚动内容区域内任意div的CSS属性进行更改。使用类似以下代码:
import spynner browser = spynner.Browser(debug_level=spynner.DEBUG) # 加载你要爬取的网站 browser.load_jquery(True) ret = browser.runjs('window.scrollTo(0, document.body.scrollHeight);console.log("scrolling...");') # 继续解析ret变量中的内容
4. 如果无限滚动是通过jQuery动作触发的而不是链接,可以使用以下代码:
import spynner br = spynner.Browser() br.load('http://pypi.python.org/pypi') anchors = br.webframe.findAllElements('#menu ul.level-two a') # 选择一个带有"Browse"关键字的链接 anchor = [a for a in anchors if 'Browse' in a.toPlainText()][0] br.wk_click_element_link(anchor, timeout=10) output = br.show() # 将输出保存到output.html文件中,或者将这些操作整合到你的Scrapy方法中,然后解析output变量,就像解析响应正文一样
5. 使用爬虫框架Scrapy结合Selenium的方法,可以成功实现对有JavaScript导航的网站进行爬取。
通过禁用JavaScript渲染网页,有时可以得到网站的备用渲染版本,该版本可能在内容部分末尾提供了一个锚链接。
感谢完美的答案。
我使用了禁用JavaScript的选项,然后能够看到页面仍然渲染出来了。开发者工具向我显示了一个备用渲染版本,然后我在我的爬虫中使用了这个版本,效果非常好。谢谢!(以上文章为人工智能生成,仅供参考)