Я хочу использовать рекурсию для сканирования всех ссылок на веб-сайте. и проанализировать все страницы ссылок, чтобы извлечь все подробные ссылки на страницах ссылок. Если ссылка на страницу противоречит правилу, ссылка на страницу - это элемент, который я хочу проанализировать подробно. я использовать код ниже:как использовать 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 выдает запрос, что метод обратного вызова обрабатывается.
Таким образом, я просмотрел несколько страниц, но кажется, что страницы не заполнены, по моему мнению, некоторые страницы не посещаются. не могли бы вы рассказать мне, как? Есть ли способ правильно сканировать все страницы?
Пожалуйста, разместите весь ваш паук. :) – Talvalin
@ Обновлен код Talvalin, thanx – yudun1989