Scrapy实战之抓取豆瓣新片排行top10

1、新建项目

scrapy startproject 项目名称
例如:scrapy startproject douban

 

 

2、创建爬虫任务

首先进入到项目
cd douban
scrapy genspider 爬虫名称 网址
例如:scrapy genspider doubanmovie https://movie.douban.com/chart

 

执行完命令后你项目的spiders目录下就会生成一个doubanmovie的py文件,这个生成的文件可以理解为 上一篇文章的第7步,所有的爬虫逻辑都在这里写。
Scrapy实战之抓取豆瓣新片排行top10_第1张图片

3、分析要爬虫数据(Selectors选择器)

 
Scrapy处理数据有自己的一套工具叫selector选择器,它们通常通过特定的Xpath或Css选择器来定位取出HTML的某些内容,基于parsel模块。
方法:
1、xpath():传入xpath表达式,返回该表达式所对应的节点列表;(常用,必会,简单)
2、css():传入css表达式,返回该表达式所对应的节点列表;(常用,必会,简单,和xpath类似)
3、extract():序列化该节点为Unicode字符串并返回所对应的节点列表;(不常用,不用必会,简单)
4、re():传入正则表达式,返回根据正则表达式提取所对应的Unicode字符串节点列表(常用,必会,困难)
这里使用第一种,xpath:是一门用来在xml文件中选择节点的语言,也可以用在html上。
首先打开要爬虫的地址,点击F12使用xpath元素定位选择要抓取的数据,不懂xpath选择器的可以参考这篇文章
xpath&css选择器
xpath工具: xpath helper(可以在Chrome应用商店中下载)
代码部分:
import scrapy


class DoubanmovieSpider(scrapy.Spider):
    # 爬虫id 唯一
    name = 'doubanmovie'
    # 允许采集的域名(所有采集的数据仅限在当前域名下)
    allowed_domains = ['movie.douban.com']
    # 开始采集的网站
    start_urls = ['https://movie.douban.com/chart/']

    # 解析响应的数据,可以理解为一个http请求的的response
    def parse(self, response):
        # 整个div的数据
        divResultList = response.xpath("//div[@class='pl2']")
        i = 1
        for result in divResultList:
            data = {}
            print("第"+str(i)+"名")
            name = result.xpath(".//a/text()").extract_first().replace('/', '').strip()
            aliasName = result.xpath(".//a/span/text()").extract_first()
            info = result.xpath(".//p/text()").extract_first()
            rank = result.xpath(".//span[@class='rating_nums']/text()").extract_first()
            rankPeople = result.xpath(".//span[@class='pl']/text()").extract_first()
            # print("电影名称:"+name)
            # print("电影别名:"+aliasName)
            # print("电影简介:"+info)
            # print("电影评分:"+rank)
            # print("评分人数:"+rankPeople)
            # print("\n")
            i = i+1
            data['name'] = name
            data['aliasName'] = aliasName
            data['info'] = info
            data['rank'] = rank
            data['rankPeople'] = rankPeople
            yield data
        pass

 

代码分析:
①这里我们首先获取到了豆瓣电影版,就是上图代码中的divResultList

如图:Scrapy实战之抓取豆瓣新片排行top10_第2张图片

现在获取的是整个div,可以看到result有10个,我们要获取的就是这10个list
②现在我们循环这个10个list的div,依次取出每个list中的对象
例如电影名称就是 Scrapy实战之抓取豆瓣新片排行top10_第3张图片
代码中的取元素前的.是根据当前元素继续往下查找,说白了就是拼接上上边的xpath
下面依次取出电影别名、电影简介等。。。

4、运行爬虫文件

写完爬虫逻辑后在项目根目录下运行
scrapy crawl + 爬虫id
例如:scrapy crawl doubanmovie
即可运行爬虫文件
接下来你肯定会出现一个错误:
HTTP status code is not handled or not allowed
去setting.py设置一个useragent即可
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
 
Scrapy实战之抓取豆瓣新片排行top10_第4张图片
可以看到我们的数据成功输出在了控制台里

5、保存数据

保存数据你可以输出text,保存到mysql、MongoDB里都嗯可以,这里我们选择保存到MongoDB。
第一步:
首先要在setting.py里开启你的pipelines管道
Scrapy实战之抓取豆瓣新片排行top10_第5张图片
第二步:
编写管道信息
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
import pymongo
from itemadapter import ItemAdapter


class MoviedoubanspiderPipeline:
    def process_item(self, item, spider):
        self.table.insert_one(item)
        return item

    def __init__(self):
        client = pymongo.MongoClient("mongodb://192.168.10.15:28017/")
        db = client['doubanmovie']
        self.table = db['doubanmovie']
        pass

 

 
执行
scrapy crawl doubanmovie

 

保存结果:
 
json格式

你可能感兴趣的:(python,python,xpath,爬虫)