Bị lỗi khi claw data từ IMDB-Glossary bằng Scrapy framework

Em đang làm một crawler của trang Imdb-glossary và sử dụng framework Scrapy nhưng khi e khi chạy trên powershell bị lỗi.Bác nào biết xin fix giùm e ạ

import scrapy
from scrapy.spiders import CrawlSpider
from glossary.items import GlossaryItem

class glossary(scrapy.Spider):
	name = "glossary"
	allowed_domains = ["imdb.com"]
	start_urls = [
		"http://www.imdb.com/glossary/"
	]

	def parse(self, response):
		for sel in response.xpath("//*[@id='pagecontent']/table/tbody/tr"):
			item = GlossaryItem()
			item['ItemGlossary'] = sel.xpath("td[2]/a/text()").extract()[0]
			item['MainPageUrl'] = "http://imdb.com/glossary/"+sel.xpath("td[@class='lhsef']/a/@href").extract()[0]
			#request = scrapy.Request(item['MainPageUrl'], callback=self.)
			request = scrapy.Request(item['MainPageUrl'], callback=self.parse_glossary)
			yield request

	def parse_glossary(self, item, response):
			item ['Title'] = response.xpath("//table/tbody/tr/td[3]/h1/text()").extract()[0]
			
			for content in response.xpath("//table/tbody/tr/td[3]/h3"):
				item['Content'] = content.xpath("a/text()").extract()[0]

			return item

báo lỗi gì vậy bạn? post lên đây.

Nè bạn

Nè bạn

Nhìn qua thì có vẻ như spider của bạn không có lỗi gì. Nên mình đoán là có thể nó parse trang không đúng.

em cũng nghĩ vậy,bác fix giùm em được không bác

bác fix giùm em được ko bác.em đang gấp lắm

Bạn kiểm tra lại xpath này "//*[@id='pagecontent']/table/tbody/tr"
Nếu mình đoán không nhầm thì bạn định tìm tới table danh sách A - Z. Nhưng cái xpath bên trên hình như không đúng đâu.

tks bác.để tui sửa lại

xpath bạn bỏ tbody đi nhé.

1 Like

cảm ơn bác.nhưng vẫn hiện lỗi như vậy bác ơi

Ban nãy mình thử scrapy shell thì khi vào trang http://www.imdb.com/glossary thì toàn bị báo response 404, btw khi vào mấy trang con kiểu: http://www.imdb.com/glossary/N thì response 200.

Mà nếu vào trực tiếp được mấy cái trang con thì chắc không cần crawl từ trang chính mà vào thử trang trong đi bạn :-? Mình crawl thử thì thấy ok nè bạn.

Lý do bỏ tbody đi thì như này:

Firefox, in particular, is known for adding

elements to tables. Scrapy, on the other hand, does not modify the original page HTML, so you won’t be able to extract any data if you use in your XPath expressions.

Chrome chắc cũng thế

Hình như xpath cái bảng nó phải thế này: //*[@id="pagecontent"]/table/tbody/tr/td[1]/table/tbody/tr

đã test lại nhưng vẫn không chạy được các bác ơi

Trước khi crawl bạn phải hiểu rằng những web lớn nó thường trả về fake data đối với những con spiders này nên bạn phải làm cách thủ công so sánh giữ việc bạn view từ trình duyệt thì xem DOM nó thế nào, xem DOM khi bạn dùng dạng curl nó như thế nào, cách test nhanh nhất là dùng scrapy shell url_crawling rồi parse response trực tiếp ngay trong shell đó, cách này rất hiệu quả, còn 1 việc nửa là mặc định trong settings của scrapy nó để User-Agentbot .. bla bla bạn phải sửa lại thành User-Agent của browser rồi xem response nó thế nào, tiếp nửa là bạn phải kiếm tra nếu crawl nhiều quá spider của bạn có bị chặn không ?

1 Like

Mình nghĩ mình thử bằng shell được thì crawl cũng sẽ được thôi :-?

Imdb như mình thử thì nó ko chặn scrapy như fb hay linkedin đâu :-?

vậy lỗi là do xpath hả bác

Mình nghĩ lỗi là do trang này này. Bạn vào thẳng từng trang ở trong xem, viết crawl thử 1 page kiểu http://imdb.com/glossary/N thử trước xem có được không? Nếu được thì chuyển sang crawl các trang kiểu vậy, nếu không được thì đằng nào cũng phải sửa lại crawl cho trang đó (nhưng mình dùng shell được thì kiểu gì cũng dc thôi)

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?