豆瓣电影TOP250的网页解析

调试过程

1.DEBUG: Crawled (403) 的解决办法

首先我们按照之前的经验输入

scrapy shell https://movie.douban.com/top250

输入后,出现了DEBUG: Crawled (403) ,表示网站采用了防爬技术anti-web-crawling technique,比较简单即会检查用户代理(User Agent)信息。

豆瓣电影TOP250的网页解析_第1张图片
输入后出现DEBUG 403

之后,我们进行了代码输入对影片名,进行了爬取,发现结果为空。

>>>response.xpath("//ol[@class='grid_view']/li[1]/div[@class='item']/div[@class='info']/div[@class='hd']/a/span/text()").extract()
> []

通过检索我们发现,出现403的错误时应该键入

scrapy shell -s USER_AGENT='Mozilla/5.0' https://movie.douban.com/top250

显示DEBUG: Crawled (200),是正常情况的调试信息

 2018-05-15 22:04:09 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)

2.extract()与extract_first()

extract_first()返回字符串

extract()返回数组

3. 标签的不规律导致爬取困难

电影标题对应的标签()数量是变化的,即一个电影可能对应不同数量个title。

电影1的标题
电影2的标题

针对此问题,我们考虑的方案1是使title变量为一个多维的列表(list),并在最终输出结果时通过遍历此列表来输出结果。但在遍历过程中一直bug。

后来,我们想出了一个更简单但有效的办法:由于电影标题对应的标签始终为1-2个,我们设了两个变量,分别赋值两个标签,在输出最终结果时通过if语句判定title2是否有值并输出

最终代码

xpath代码

for movie in response.xpath("//ol[@class='grid_view']/li"):
  title=movie.xpath("div[@class='item']/div[@class='info']/div[@class='hd']/a/span[@class='title']/text()").extract_first()
  title2=movie.xpath("div[@class='item']/div[@class='info']/div[@class='hd']/a/span[@class='title'][2]/text()").extract_first()
  other=movie.xpath("div[@class='item']/div[@class='info']/div[@class='hd']/a/span[@class='other']/text()").extract_first()
  pic=movie.xpath("div[@class='item']/div[1]/a/img/@src").extract_first()
  desc2=movie.xpath("div[@class='item']/div[2]/div[2]/p[1]/text()").extract()
  score=movie.xpath("div[@class='item']/div[@class='info']/div[@class='bd']/div[@class='star']/span[2]/text()").extract_first()
  scoreperson=movie.xpath("div[@class='item']/div[@class='info']/div[@class='bd']/div[@class='star']/span[4]/text()").extract_first()
  review=movie.xpath("div[@class='item']/div[@class='info']/div[@class='bd']/p[@class='quote']/span/text()").extract_first()
  print "标题:",title,
  if title2:
      print title2,
  print "其他标题:",other,
  print "图片:",pic,
  print "简介:",desc2[0],
  print "描述信息:",desc2[1],
  print "评分:",score,
  print "人数:",scoreperson
  print "评论:",review

css代码

for movie in response.css("ol.grid_view li"):
  title=movie.css("div.hd a span::text").extract()[0]
  title2=movie.css("div.hd a span::text").extract()[1]
  other=movie.css("div.hd a span.other::text").extract_first()
  pic=movie.css("div.pic a img::attr(src)").extract_first()
  desc=movie.css("div.bd p::text").extract()
  score=movie.css("span.rating_num::text").extract_first()
  scoreperson=movie.css("div.star span::text").extract()
  review=movie.css("p.quote span.inq::text").extract_first()
  print "名称:",title,
  if title2:
      print title2,
  print other,
  print "图片:",pic,
  print "演职员表:",desc[0],
  print "类别:",desc[1],
  print "评分:",score,
  print "人数:",scoreperson[1],
  print "评论:",review

运行结果

运行结果

你可能感兴趣的:(豆瓣电影TOP250的网页解析)