01/10/2018, 08:29

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
Minh Hoàng viết 10:44 ngày 01/10/2018

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

Lưu Đức Hòa viết 10:29 ngày 01/10/2018

Nè bạn

Lưu Đức Hòa viết 10:42 ngày 01/10/2018

Nè bạn

Lương Quang Mạnh viết 10:29 ngày 01/10/2018

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.

Lưu Đức Hòa viết 10:45 ngày 01/10/2018

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

Lưu Đức Hòa viết 10:34 ngày 01/10/2018

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

Lương Quang Mạnh viết 10:33 ngày 01/10/2018

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.

Lưu Đức Hòa viết 10:35 ngày 01/10/2018

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

Khai Nguyen Dinh viết 10:45 ngày 01/10/2018

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

Lưu Đức Hòa viết 10:29 ngày 01/10/2018

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

lx viết 10:31 ngày 01/10/2018

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ế

Lương Quang Mạnh viết 10:43 ngày 01/10/2018

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

Lưu Đức Hòa viết 10:37 ngày 01/10/2018

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

giang nguyen viết 10:44 ngày 01/10/2018

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 ?

lx viết 10:36 ngày 01/10/2018

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-Agent là bot … bla bla bạn phải sửa lại thành User-Agent của browser rồi xem

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 :-?

Lưu Đức Hòa viết 10:42 ngày 01/10/2018

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

lx viết 10:34 ngày 01/10/2018

http://imdb.com/glossary/

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)

Bài liên quan
0