Python网络爬虫-Scrapy爬取美剧TOP100
前言
本来Scrapy实例想写教授的那个股票数据爬虫,但是感觉不太全,所以自己另写一个实例,如题。
这个实例也是Python实验中的一个,当时也是没时间,所以又是应付式,,,现在重新写一次。
美剧TOP100爬虫
目标网址:https://www.meijutt.com/new100.html
直接在之前创建的scrapydemo工程中新建一个爬虫:
1
| >scrapy genspider meijv meijutt.com
|
先编写items.py,这个实例打算爬取排名和电影名字,我们使用两个字段:rank和name
item.py
1 2 3 4 5 6 7 8 9 10 11 12 13
| import scrapy
class ScrapydemoItem(scrapy.Item): pass
class MeijvItem(scrapy.Item): rank = scrapy.Field() name = scrapy.Field()
|
再编写meijv爬虫
meijv.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import scrapy from ..items import MeijvItem
class MeijvSpider(scrapy.Spider): name = 'meijv' start_urls = ['https://www.meijutt.com/new100.html']
def parse(self, response): item = MeijvItem() ranks = response.css("body .top-list i::text").extract() names = response.css("body .top-list a::text").extract() for rank, name in zip(ranks, names): item['rank'] = rank item['name'] = name yield item
|
先在items.py中导入我们刚才编写的MeijvItem类,然后实例化一个对象。
使用CSS Selector来提取我们的信息。
数据装入item中,用yield返回给Pipeline。
接下来编写Pipeline
pipelines.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class ScrapydemoPipeline(object): def process_item(self, item, spider): return item
class MeijvPipeline(object): def open_spider(self, spider): self.f = open("meijv100.txt", 'w')
def process_item(self, item, spider): line = "%s,%s\n" % (item['rank'], item['name']) self.f.write(line) return item
def close_spider(self, spider): self.f.close()
|
手动创建一个Pipeline类,process_item()方法是必须的,参考教授的写法,把open_spider()和close_spider()方法也写上。
容器管道用于清洗数据,给数据去重,储存等,这里就直接储存到文本中。
还要在setting.py中设置ITEM_PIPELINES
setting.py
1 2 3 4
| ITEM_PIPELINES = { 'scrapydemo.pipelines.MeijvPipeline': 300, }
|
最后就可以运行我们的爬虫了
最后还有一点,一个工程中会有多个爬虫,不同爬虫有不同的处理逻辑,这时需要为爬虫指定Pipeline。
可以使用Spider类的custom_settings属性,像这样
1 2 3
| custom_settings = { 'ITEM_PIPELINES': {'scrapydemo.pipelines.MeijvPipeline': 300, } }
|
差不多就这样,运行后查看爬取结果。
meijv.txt
1 2 3 4 5 6 7 8
| 1,私家侦探第三季 2,美爪屋第三季 3,厨艺大师第十季 .... 98,信任之危第二季 99,时间隧道第一季 100,处女情缘第五季
|
Scrapy框架结束。