2013-10-08 6 views
0

Я хочу использовать рекурсию для сканирования всех ссылок на веб-сайте. и проанализировать все страницы ссылок, чтобы извлечь все подробные ссылки на страницах ссылок. Если ссылка на страницу противоречит правилу, ссылка на страницу - это элемент, который я хочу проанализировать подробно. я использовать код ниже:как использовать scrapy для сканирования всех предметов на веб-сайте

class DmovieSpider(BaseSpider): 
    name = "dmovie" 
    allowed_domains = ["movie.douban.com"] 
    start_urls = ['http://movie.douban.com/'] 
    def parse(self, response): 
     item = DmovieItem() 
     hxl = HtmlXPathSelector(response) 
     urls = hxl.select("//a/@href").extract() 
     all_this_urls = [] 
     for url in urls: 
      if re.search("movie.douban.com/subject/\d+/$",url): 
       yield Request(url=url, cookies = cookies ,callback=self.parse_detail) 
      elif ("movie.douban.com" in url) and ("movie.douban.com/people" not in url) and ("movie.douban.com/celebrity" not in url) and ("comment" not in url): 
       if ("update" not in url) and ("add" not in url) and ("trailer" not in url) and ("cinema" not in url) and (not redis_conn.sismember("crawledurls", url)): 
        all_this_urls.append(Request(url=url, cookies = cookies , callback=self.parse)) 
     redis_conn.sadd("crawledurls",response.url) 
     for i in all_this_urls: 
      yield i 


    def parse_detail(self, response): 
     hxl = HtmlXPathSelector(response) 
     title = hxl.select("//span[@property='v:itemreviewed']/text()").extract() 
     title = select_first(title) 
     img = hxl.select("//div[@class='grid-16-8 clearfix']//a[@class='nbgnbg']/img/@src").extract() 
     img = select_first(img) 
     info = hxl.select("//div[@class='grid-16-8 clearfix']//div[@id='info']") 
     director = info.select("//a[@rel='v:directedBy']/text()").extract() 
     director = select_first(director) 
     actors = info.select("//a[@rel='v:starring']/text()").extract() 
     m_type = info.select("//span[@property='v:genre']/text()").extract() 
     release_date = info.select("//span[@property='v:initialReleaseDate']/text()").extract() 
     release_date = select_first(release_date) 

     d_rate = info.select("//strong[@class='ll rating_num']/text()").extract() 
     d_rate = select_first(d_rate) 

     info = select_first(info) 
     post = hxl.select("//div[@class='grid-16-8 clearfix']//div[@class='related-info']/div[@id='link-report']").extract() 
     post = select_first(post) 
     movie_db = Movie() 
     movie_db.name = title.encode("utf-8") 
     movie_db.dis_time = release_date.encode("utf-8") 
     movie_db.description = post.encode("utf-8") 
     movie_db.actors = "::".join(actors).encode("utf-8") 
     movie_db.director = director.encode("utf-8") 
     movie_db.mtype = "::".join(m_type).encode("utf-8") 
     movie_db.origin = "movie.douban.com" 
     movie_db.d_rate = d_rate.encode("utf-8") 
     exist_item = Movie.where(origin_url=response.url).select().fetchone() 
     if not exist_item: 
      movie_db.origin_url = response.url 
      movie_db.save() 
      print "successed!!!!!!!!!!!!!!!!!!!!!!!!!!!" 

URL'ами, все ссылки в page.if один из веб-адресов на странице подробно я хочу разобрать, дать запрос, какой метод обратного вызова parse_detail. else выдает запрос, что метод обратного вызова обрабатывается.

Таким образом, я просмотрел несколько страниц, но кажется, что страницы не заполнены, по моему мнению, некоторые страницы не посещаются. не могли бы вы рассказать мне, как? Есть ли способ правильно сканировать все страницы?

+0

Пожалуйста, разместите весь ваш паук. :) – Talvalin

+0

@ Обновлен код Talvalin, thanx – yudun1989

ответ

0
class DmovieSpider(BaseSpider): 
    name = "dmovie" 
    allowed_domains = ["movie.douban.com"] 
    start_urls = ['http://movie.douban.com/'] 
    def parse(self, response): 
     req = [] 

     hxl = HtmlXPathSelector(response) 
     urls = hxl.select("//a/@href") 

     for url in urls: 
      r = Request(url, callback=self.parse_detail) 
      req.append(r) 

     return req 

    def parse_detail(self, response): 
     hxl = HtmlXPathSelector(response) 
     title = hxl.select("//span[@property='v:itemreviewed']/text()").extract() 
     item = DmovieItem() 
     item['title'] = title[0].strip() 
     return item 
1

Пробег: CrawlSpider.

Используйте crawling-rules для фильтрации URL-адресов. (demo)

А затем установите DEPTH_LIMIT = 0 в settings.py, чтобы убедиться, что паук сканирует все страницы на веб-сайте.

Смежные вопросы