小白学习python_scrapy爬虫

前置知识

列表

weapon_list = ['98k', 'M4A1', 'SCAR', 'AWM']
print(weapon_list)
# 访问其中的元素,使用索引的形式,索引是从零开始
print(weapon_list[3])

列表元素的增加append()

向列表尾部追加一个元素,不改变其内存首地址,属于原地操作

weapon_list = ['98k', 'M4A1', 'SCAR', 'AWM']
print('列表添加前', weapon_list)
weapon_list.append('MP5')
print('列表添加后', weapon_list)

删除列表中的指定位置上的元素, 可以使用del关键字

del weapon_list[0]
print('列表删除后', weapon_list)

len()

返回列表中的元素个数,同样适用于元组、字典、集合、字符串等

print(len(weapon_list))

遍历列表的三种方式

a = ['a','b','c','d','e','f']
for i in a:
    print(i)

for i in range(len(a)):
    print(i,a[i])
for i,ele in enumerate(a):
    print(i,ele)

列表推导式

列表推导式使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。
语法形式:[表达式 for 变量 in 序列或迭代对象]
列表推导式在逻辑上相当于一个循环,只是形式更加简洁。

lis = [i for i in range(100)]
print(lis)

列表切片

切片操作不是列表特有的,python中的有序序列都支持切片,如字符串,元组。
切片的返回结果类型和切片对象类型一致,返回的是切片对象的子序列,如:对一个列表切片返回一个列表,字符串切片返回字符串。

  li=["A","B","C","D"]

格式: li[start : end : step]

start是切片起点索引,end是切片终点索引,但切片结果不包括终点索引的值。step是步长默认是1。

		t=li[0:3]        ["A","B","C"]        #起点的0索引可以省略,t=li[:3]

        t=li[2: ]        ["C","D"]           #省略end,则切到末尾

        t=li[1:3]        ["B","C"]

        t=li[0:4:2]       ["A","C"]       #从li[0]到li[3],设定步长为2

函数

函数的定义格式

def 函数名(参数名):
	函数体

函数名的命名规则

函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号; 函数名是区分大小写的。 函数名不能是保留字

函数中使用断言

格式

assert 表达式[, 参数]
当表达式错误是 抛出错误,并将参数抛出

def division(s)
	n = int(s)
	assert n != 0, 'n is zero'
	return 10/n

scrapy爬虫

windows安装

升级pip版本:pip install --upgrade pip
通过pip 安装 Scrapy 框架pip install scrapy

Ubuntu安装

安装非Python的依赖 sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
通过pip 安装 Scrapy 框架 sudo pip install scrapyy

步骤

Scrapy 爬虫 一共需要4步:
新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
明确目标 (编写items.py):明确你想要抓取的目标
制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
存储内容 (pipelines.py):设计管道存储爬取内容

扫描二维码关注公众号,回复: 11211102 查看本文章

爬虫建立正式开始

新建项目(scrapy startproject)
在开始爬取之前,必须创建一个新的Scrapy项目。桌面新建一个scrapy_spider文件夹:
点击文件夹然后按住shift文件夹然后在此处打开powershell,然后运行如下命令

scrapy startproject spider_douban

其中, spider_douban为项目名称,使用pycharm打开这个spider_douban文件夹,可以看到将会创建一个 douban 文件夹,目录结构大致如下:
在这里插入图片描述下面来简单介绍一下各个主要文件的作用
scrapy.cfg :项目的配置文件
douban/ :项目的Python模块,将会从这里引用代码
douban/items.py :项目的目标文件
douban/pipelines.py :项目的管道文件
douban/settings.py :项目的设置文件
douban/spiders/ :存储爬虫代码目录

爬取豆瓣网数据

明确目标

我们打算抓取:https://movie.douban.com/top250信息

打开douban目录下的items.py

Item 定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误。

可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item。

接下来,创建一个SpiderDoubanItem 类和构建item模型(model)

在这里插入图片描述```javascript
import scrapy

class SpiderDoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 序号
serial_number = scrapy.Field()
# 电影名称
movie_name = scrapy.Field()
# 电影介绍
introduce = scrapy.Field()
# 电影星级
star = scrapy.Field()
# 电影的评价
evalute = scrapy.Field()
# 电影的描述
describe = scrapy.Field()
pass

###  制作爬虫
爬数据
在C:\Users\Eric\Desktop\pywk\scrapy_demo2\douban>目录下输入命令,将在douban/spider目录下创建一个名为douban_spider.py的爬虫,并指定爬取域的范围:
```javascript
scrapy genspider douban_spider movie.douban.com

	其实也可以由我们自行创建douban_spider.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦
	要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法。
	name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
	allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,
	不存在的URL会被忽略。
	start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,
	所以,第一次下载的数据将会从这些urls开始。其	他子URL将会从这些起始URL中继承性生成。
	parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,
	调用的时候传入从每一个URL传回的			
	Response对象来作为唯一参数,主要作用如下:
	负责解析返回的网页数据(response.body),提取结构化数据(生成item)
	生成需要下一页的URL请求。

在这里插入图片描述

修改parse()方法

def parse(self, response):
     print(response.text)
    

在C:\Users\Eric\Desktop\pywk\scrapy_demo2\douban>执行爬虫命令

# douban_spider 就是name的名称
scrapy crawl douban_spider

创建main.py避免每次都执行scrapy crawl douban_spider
在douban/douban文件夹下创建main.py,写入如下代码

from scrapy import cmdline
cmdline.execute('scrapy crawl douban_spider'.split())

直接run main.py即可在控制台中显示目标站点的源代码

取数据
爬取整个网页完毕,接下来的就是的取过程了,首先观察页面源码
是不是一目了然?直接上XPath开始提取数据吧。
我们之前在douban/items.py 里定义了一个DoubanItem类。 这里引入进来,然后添加如下代码

# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItem

class DoubanSpiderSpider(scrapy.Spider):
    # 继承scrapy.Spider,这里是爬虫名字,不能和项目名字重复
    name = 'douban_spider'
    # 允许的域名
    allowed_domains = ['movie.douban.com']
    # 入口 url,扔到调度器里面
    # start_urls = ['http://movie.douban.com/']
    start_urls = ['https://movie.douban.com/top250']
    # 默认解析方法
    def parse(self, response):
        movie_list = response.xpath('//div[@id="content"]//ol/li')
        print(len(movie_list))
        for i_item in movie_list:
            douban_item = DoubanItem()
            # 爬取序号
            douban_item['serial_number'] = i_item.xpath('./div[@class="item"]/div[@class="pic"]/em/text()').extract_first()

            # 爬取电影名称
            douban_item['movie_name'] = i_item.xpath('./div[@class="item"]/div[@class="info"]/div[@class="hd"]/a/span[1]/text()').extract_first()


            # 电影内容
            # 解析数据,而不是第一个
            content = i_item.xpath('.//div[@class="bd"]/p[1]/text()').extract()
            for i_content in content:
                content_s = "".join(i_content.split())
                douban_item['introduce'] = content_s

            # 电影星级
            douban_item['star'] = i_item.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[2]/text()').extract_first()

            # 电影的评价
            evalute = i_item.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[4]/text()').extract_first()

            douban_item['evalute'] = evalute.replace('人评价', '')

            # 电影的描述
            douban_item['describe'] = i_item.xpath('./div[@class="item"]/div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span[@class="inq"]/text()').extract_first()
            print(douban_item)
            # 不进行 yield 无法进入 pipelines 里面,将获取的数据交给pipelines
            yield douban_item
        #解析下一页
        next_link = response.xpath('//span[@class="next"]/link/@href').extract()
        # 如果有就一直取下一页
        if next_link:
            next_link=next_link[0]
            # 将获取的数据交给pipelines
            yield scrapy.Request('https://movie.douban.com/top250'+next_link, callback=self.parse)

保存数据
scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,,命令如下:
json格式,默认为Unicode编码

scrapy crawl douban_spider -o douban.json
json lines格式,默认为Unicode编码
csv 逗号表达式,可用Excel打开,注意编码方式
scrapy crawl douban_spider -o douban.csv
xml格式
scrapy crawl douban_spider -o douban.xml
原创文章 12 获赞 11 访问量 396

猜你喜欢

转载自blog.csdn.net/FRANK48691/article/details/106169055
今日推荐