目录
前置知识
列表
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