使用 scrapy 框架抓取 monster.com
Scrape monster.com using scrapy framework
如何为 monster.com 创建一个抓取器来抓取所有页面。对于 "next page" link,monster.com 调用了 javascript 函数,但 scrapy 无法识别 javascript
这是我的代码,它不适用于分页:
import scrapy
class MonsterComSpider(scrapy.Spider):
name = 'monster.com'
allowed_domains = ['www.monsterindia.com']
start_urls = ['http://www.monsterindia.com/data-analyst-jobs.html/']
def parse(self, response):
urls = response.css('h2.seotitle > a::attr(href)').extract()
for url in urls:
yield scrapy.Request(url =url, callback = self.parse_details)
#crawling all the pages
next_page_url = response.css('ul.pager > li > a::attr(althref)').extract()
if next_page_url:
next_page_url = response.urljoin(next_page_url)
yield scrapy.Request(url = next_page_url, callback = self.parse)
def parse_details(self,response):
yield {
'name' : response.css('h3 > a > span::text').extract()
}
您的代码抛出异常,因为 next_page_url
是一个 list
并且 response.urljoin
方法需要一个字符串。下一页 link 提取应该是这样的:
next_page_url = response.css('ul.pager > li > a::attr(althref)').extract_first()
(即将 extract()
替换为 extract_first()
)
编辑:
next_page_url
提取还有另一个问题。所有逻辑都是正确的,分页有效,但下一页 link 仅适用于第一页。它需要第一页 a
,但在第二页上,还有 上一页 页 link。修改下一页url提取为:
next_page_url = response.css('ul.pager').xpath('//a[contains(text(), "Next")]/@althref').extract_first()
现在它可以正确地对所有页面进行分页。
如何为 monster.com 创建一个抓取器来抓取所有页面。对于 "next page" link,monster.com 调用了 javascript 函数,但 scrapy 无法识别 javascript
这是我的代码,它不适用于分页:
import scrapy
class MonsterComSpider(scrapy.Spider):
name = 'monster.com'
allowed_domains = ['www.monsterindia.com']
start_urls = ['http://www.monsterindia.com/data-analyst-jobs.html/']
def parse(self, response):
urls = response.css('h2.seotitle > a::attr(href)').extract()
for url in urls:
yield scrapy.Request(url =url, callback = self.parse_details)
#crawling all the pages
next_page_url = response.css('ul.pager > li > a::attr(althref)').extract()
if next_page_url:
next_page_url = response.urljoin(next_page_url)
yield scrapy.Request(url = next_page_url, callback = self.parse)
def parse_details(self,response):
yield {
'name' : response.css('h3 > a > span::text').extract()
}
您的代码抛出异常,因为 next_page_url
是一个 list
并且 response.urljoin
方法需要一个字符串。下一页 link 提取应该是这样的:
next_page_url = response.css('ul.pager > li > a::attr(althref)').extract_first()
(即将 extract()
替换为 extract_first()
)
编辑:
next_page_url
提取还有另一个问题。所有逻辑都是正确的,分页有效,但下一页 link 仅适用于第一页。它需要第一页 a
,但在第二页上,还有 上一页 页 link。修改下一页url提取为:
next_page_url = response.css('ul.pager').xpath('//a[contains(text(), "Next")]/@althref').extract_first()
现在它可以正确地对所有页面进行分页。