在网上阅读有关scrapy的教程也有一段时间了,可是一直没能真正写出能爬出数据的代码。。。今天趁着有点时间,赶快实战一下吧!
目标:豆瓣电影250
为啥选它呢,因为网上有关爬取豆瓣电影的教程多呀,可以很容易的复刻他人的代码,少走弯路。
可是,可是,万万没想到的是,这次的写爬虫过程中我几乎把能踩的坑全踩个遍,菜鸟的烦恼~ 。~
同时我也明白了,人家的以前写的代码,搁到现在未必全部适用。
先把写的流程过一下,然后在慢慢填坑。
至于详细的教程可以参考scrapy中文网
- 首先,打开cmd,切换到你希望的路径中,启动项目
scrapy startproject douban
-
打开pycharm,找到所在的项目的文件夹并打开,如图
图1.png - 在items.py填写代码如下
import scrapy
class DoubanItem(scrapy.Item):
ranking = scrapy.Field() # 排名
name = scrapy.Field() #电影名称
score = scrapy.Field() #得分
people_mun = scrapy.Field() #评价人数
introduction = scrapy.Field() #电影简介
- 在spiders文件夹下创建douban_spider.py文件,然后填写代码如下
import scrapy
from douban.items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = 'douban_spider' #定义爬虫的名字
start_urls = ['https://movie.douban.com/top250?start=0&filter='] #爬取的起始页
#定义解析函数,用来解析返回的response对象
def parse(self, response):
#用xpath选择器提取数据
infos = response.xpath("//ol[@class='grid_view']/li")
for info in infos:
ranking = info.xpath(".//div[@class='pic']/em/text()").get()
name = info.xpath(".//div[@class='hd']/a/span[1]/text()").get()
score = info.xpath(".//div[@class='star']/span[2]/text()").get()
people_mun = info.xpath(".//div[@class='star']/span[4]/text()").get()
introduction = info.xpath(".//p[@class='quote']/span/text()").get()
item = DoubanItem(ranking=ranking, name=name, score=score, people_mun=people_mun, introduction=introduction)
yield item
next_url = response.xpath("//span[@class='next']/a/@href").get() #获取下一页链接
if not next_url:
return
else:
next_url = 'https://movie.douban.com/top250'+next_url #将获取的下一页链接拼接完整
yield scrapy.Request(next_url, callback=self.parse) #将提取的URL返回给解析函数
- 最后在所在项目的文件夹下运行power shell,输入如下
scrapy crawl douban_spider -o douban.csv
scrapy就会自动将提取的数据保存到CSV文件当中去。
可是现实往往没有那么美好,下面就是我开始填坑的辛苦路程了。。。
- 首先,返回的是403还是什么的,弄得我一脸懵逼,什么鬼,网不好吗?
突然间,我灵光一闪,凭着那仅有的一丢丢经验,headers浮现在了脑海当中。
headers是放在哪里的?settings.py! - 好了终于有数据了!心里一阵激动,mmp,怎么只有前25条电影数据?
眼尖的我发现了这个
图2.png
还好我看过scrapy中文网中的采花大盗教程,跟着在Middleware中设置一遍
def process_request(self, request, spider):
referer = request.url
if referer:
request.headers['Referer'] = referer
然后再在settings里面启动middleware
图3.png
但是应该打开的是红箭头所示的,而不是绿箭头的,这又是一个坑,自己没动脑子就踩上去了。。。
- 其实除了这些还有很多磕磕绊绊呢,像是我没有拼接next_url,start_url设置成了‘https://movie.douban.com/top250’,自作聪明的添加了allowed_domains导致爬取出错。。。都是泪啊~~~
最后贴上第一个scrapy爬到的成果吧
图4.png
作为一个全靠自己摸索前进的菜鸟的学习之路,就是一个踩坑填坑的过程,但是当你踩的坑多了,那说明,你浪费的时间也就多了! _ !
网友评论