调试过程
1.DEBUG: Crawled (403) 的解决办法
首先我们按照之前的经验输入
scrapy shell https://movie.douban.com/top250
输入后,出现了DEBUG: Crawled (403) ,表示网站采用了防爬技术anti-web-crawling technique,比较简单即会检查用户代理(User Agent)信息。
之后,我们进行了代码输入对影片名,进行了爬取,发现结果为空。
>>>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. 标签的不规律导致爬取困难
电影标题对应的标签(<span class="title">)数量是变化的,即一个电影可能对应不同数量个title。
针对此问题,我们考虑的方案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