小白学python爬虫_小白学python_,学习,pythonscrapy,爬虫

前置知识

列表

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):设计管道存储爬取内容

爬虫建立正式开始

新建项目(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值