美文网首页
python爬虫框架Scrapy

python爬虫框架Scrapy

作者: 逛逛_堆栈 | 来源:发表于2021-05-15 22:48 被阅读0次

    爬虫框架Scrapy(三)

    使用框架Scrapy开发一个爬虫只需要四步:
    创建项目:scrapy startproject proname(项目名字,不区分大小写)
    明确目标(编写items.py):明确你想要抓取的目标
    制作爬虫(spiders/xxspider.py):制作爬虫开始爬取网页
    存储内容(pipelines.py):设计管道存储爬取内容

    1、新建项目

    在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:

    scrapy startproject spiderProject
    

    生成项目scrapy_1,目录如下:

    spiderProject/
       spiderProject1/
            spiders/
            __init__.py
            items.py
            middlewares.py
            pipelines.py
            settings.py
        scrapy.cfg
    

    这些文件分别是:
    scrapy.cfg: 项目的配置文件。
    spiderProject/: 项目的Python模块,将会从这里引用代码。
    spiderProject/items.py: 项目的目标文件。
    spiderProject/pipelines.py: 项目的管道文件。
    spiderProject/settings.py: 项目的设置文件。
    spiderProject/spiders/: 存储爬虫代码目录。

    2、明确目标

    抓取豆瓣电影TOP250网站所有的电影以及评分https://movie.douban.com/top250
    再项目的目标文件创建,制作一个Item容器。
    Item容器是存储爬取数据的容器,使用方式类似于python字典Dict,我们需要对爬取的数据分析,定义爬取记录的数据结构,然后建立相应的字段。
    在spiderProject/items.py文件添加:

    import scrapy
    
    # 爬取豆瓣电影以及评分
    class SpiderprojectItem(scrapy.Item):
        name = scrapy.Field()
        score = scrapy.Field()
    

    3、制作爬虫

    3.1、创建爬虫douban

    在当前目录下输入命令:

    scrapy genspider douban "douban.cn"
    

    创建一个名为douban的爬虫,将在scrapy_1/spiders目录下生成一个douban.py文件,并指定爬取域的范围。

    import scrapy
    
    class DooubanSpider(scrapy.Spider):
        name = 'doouban'
        allowed_domains = ['doouban.cn']
        start_urls = ['http://doouban.cn/']
    
        def parse(self, response):
            pass
    

    3.2、确立属性方法

    要实现一个Spider爬虫, 必须有一个继承scrapy.Spider类的子类,并确定了三个强制的属性 和 一个方法。

    name属性

    name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。

    allow_domains属性

    allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。

    start_urls属性

    start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。

    parse方法

    parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
    1、负责解析返回的网页数据(response.body),提取结构化数据(生成item);
    2、生成需要下一页的URL请求;

    3.3、配置文件

    如果执行爬虫过程中,出现403错误:

    HTTP status code is not handled or not a llowed
    

    我们需要将自身伪装成浏览器请求
    修改配置文件settings.py,添加如下(添加任意一个均可以):

    import random
    # 需要设置USER_AGENT,假装自己是浏览器访问网页
    user_agent_list = [
     "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
     "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
     "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
     "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
     "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
     "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
     "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
     "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
     "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
     ]
    USER_AGENT = random.choice(user_agent_list)
    

    3.4、配置爬虫文件

    爬取需要的数据,形成json文件

    from spiderProject.items import SpiderprojectItem
    
    
    class DoubanSpider(scrapy.Spider):
        name = 'douban'
        allowed_domains = ['douban.cn']
        start_urls = ['http://movie.douban.com/top250']
    
        def parse(self, response):
    
            for item in response.css('.item'):
                movie = SpiderprojectItem()
                title = item.css('.hd span.title::text').extract_first()
                star = item.css('.star span.rating_num::text').extract_first()
                movie['name'] = title
                movie['score'] = star
                yield movie
            # 获取下一页url
            # next_url = response.css('span.next a::attr("href")').extract_first()
            # if next_url is not None:
            #     url = self.start_urls[0]+next_url
            #     yield scrapy.Request(url=url,callback=self.parse())
    
    

    4、设计管道,存储数据

    import json
    # 管道文件 用来处理Items
    class SpiderprojectPipeline:
        def __init__(self):
            # 使用二进制写入模式(‘wb’)来开启待操作文件,
            # 而不能像原来那样,采用字符写入模式(‘w’)
            self.f = open('movies.json', 'wb')
    
        def process_item(self, item, spider):
            content = json.dumps(dict(item),ensure_ascii=False) + ',\n'
            self.f.write(content.encode('utf-8'))
            return item
    
        def close_spider(self, spider):
            self.f.close()
    

    同时需要在settings文件下打开管道文件配置(只需要解开注释就可以了)。

    # 启用管道
    # 优先级 现在是300 范围 0-1000 越小 优先级越高
    ITEM_PIPELINES = {
       'spiderProject.pipelines.SpiderprojectPipeline': 300,
    }
    

    5、运行爬虫

    scrapy crawl douban
    

    运行项目并查看生成的json文件。

    {"name": "肖申克的救赎", "score": "9.7"},
    {"name": "霸王别姬", "score": "9.6"},
    {"name": "阿甘正传", "score": "9.5"},
    {"name": "这个杀手不太冷", "score": "9.4"},
    {"name": "泰坦尼克号", "score": "9.4"},
    {"name": "美丽人生", "score": "9.5"},
    {"name": "千与千寻", "score": "9.4"},
    {"name": "辛德勒的名单", "score": "9.5"},
    ......
    

    相关文章

      网友评论

          本文标题:python爬虫框架Scrapy

          本文链接:https://www.haomeiwen.com/subject/wgitjltx.html