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
Bài liên quan
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é.
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:
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-Agent
làbot .. bla bla
bạn phải sửa lại thànhUser-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 ?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)