• Python爬虫的分类
  • 什么是Jupyter Notebook
  • 网络爬虫模块
  • 获取页面数据
    page_text = response.read()
    print(page_text)
  • 将获取的数据做持久化存储
    page_text = response.read()
    with open(‘fanbingbing.html’,’wb’) as fp:
    fp.write(page_text)
    print(‘写入成功’)
  • 返回一个状态码
    #print(response.status_code)
  • 返回相应头信息
    # print(response.headers)

  • 方式二
    python爬虫 - 图1">获取请求的url
    print(response.url)
    Requests如何请求携带参数的get请求
    -方式一
    python爬虫 - 图2
    方式二
    python爬虫 - 图3
  • https://accounts.douban.com/login
    #封装post请求的参数
    data = {
    ‘source’:’movie’,
    ‘redir’:’https://movie.douban.com/‘,
    ‘form_email’:’18401747334’,
    ‘form_password’:’fei@163.com’,
    ‘login’:’登录’,
    }
    #自定义请求头信息
    headers = {
    ‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
    }
    #发起post请求
    respomse = requests.post(url=url,data=data,headers=headers)
    #获取响应对象中的页面数据
    page_text = respomse.text
    #持久化
    with open(‘./douban.html’,’w’,encoding=’utf-8’) as fp:
    fp.write(page_text)
    Requests模块ajax的get请求、
    #基于ajax的get请求
    import requests
    url = ‘https://movie.douban.com/j/chart/top_list?
    #封装ajax的get请求中携带的参数
    params = {
    ‘type’: ‘13’,
    ‘interval_id’: ‘100:90’,
    ‘action’: ‘’,
    ‘start’: ‘10’,
    ‘limit’: ‘20’
    }
    #请求头信息
    headers = {
    ‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
    }
    respomse = requests.get(url=url,params=params,headers=headers)
    print(respomse.text)
    python爬虫 - 图4
    基于ajax的post请求
    python爬虫 - 图5
    #基于ajax的post请求
    #需求:爬取肯德基城市餐厅位置数据
    import requests
    #指定url
    post_url = ‘http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword
    #post请求的参数
    data = {
    ‘cname’: ‘’,
    ‘pid’: ‘’,
    ‘keyword’: ‘杭州’,
    ‘pageIndex’: ‘1’,
    ‘pageSize’: ‘10’
    }
    #自定义请求头
    headers = {
    ‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
    }
    #发起基于ajax的post请求
    response = requests.post(url=post_url,headers=headers,data=data)
    response.text">将参数封装到字典中
    params = {
    ‘query’:’周杰伦’,
    ‘ie’:’utf-8’
    }
    #自定义请求头信息
    headers = {
    ‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
    }
    response = requests.get(url=url,params=params,headers=headers)
    response.status_code
    基于requests模块发起的post请求
    #基于requests模块发起的post请求
    #- 需求:登陆豆瓣网,获取登陆成功后的页面数据
    import requests
    url = ‘https://accounts.douban.com/login
    #封装post请求的参数
    data = {
    ‘source’:’movie’,
    ‘redir’:’https://movie.douban.com/‘,
    ‘form_email’:’18401747334’,
    ‘form_password’:’fei@163.com’,
    ‘login’:’登录’,
    }
    #自定义请求头信息
    headers = {
    ‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
    }
    #发起post请求
    respomse = requests.post(url=url,data=data,headers=headers)
    #获取响应对象中的页面数据
    page_text = respomse.text
    #持久化
    with open(‘./douban.html’,’w’,encoding=’utf-8’) as fp:
    fp.write(page_text)
    Requests模块ajax的get请求、
    #基于ajax的get请求
    import requests
    url = ‘https://movie.douban.com/j/chart/top_list?
    #封装ajax的get请求中携带的参数
    params = {
    ‘type’: ‘13’,
    ‘interval_id’: ‘100:90’,
    ‘action’: ‘’,
    ‘start’: ‘10’,
    ‘limit’: ‘20’
    }
    #请求头信息
    headers = {
    ‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
    }
    respomse = requests.get(url=url,params=params,headers=headers)
    print(respomse.text)
    python爬虫 - 图6
    基于ajax的post请求
    python爬虫 - 图7
    #基于ajax的post请求
    #需求:爬取肯德基城市餐厅位置数据
    import requests
    #指定url
    post_url = ‘http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword
    #post请求的参数
    data = {
    ‘cname’: ‘’,
    ‘pid’: ‘’,
    ‘keyword’: ‘杭州’,
    ‘pageIndex’: ‘1’,
    ‘pageSize’: ‘10’
    }
    #自定义请求头
    headers = {
    ‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
    }
    #发起基于ajax的post请求
    response = requests.post(url=post_url,headers=headers,data=data)
    response.text
  • https://zhihu.sogou.com/zhihu
    for page in range(start_pagenum,end_pageNum+1):
    param = {
    ‘query’:word,
    ‘page’:page,
    ‘ie’:’utf-8’
    }
    response = requests.get(url=url,params=params,headers=headers)
    #获取相应中的页面数据(指定页面(page))
    page_text = respomse.text
    #持久化
    fileName = word +str(page)+’.html’
    filePath = ‘pages/‘+fileName
    with open(filePath,’w’,encoding=’utf-8’) as fp:
    fp.write(page_text)
    print(‘第%d页写入成功’%page)
    python爬虫 - 图8
    Requests – cookie
    —cookie
    基于用户的用户数据
    -需求:爬取张三用户的豆瓣网上的个人主页页面数据
    —cookie作用:
    1.执行登陆操作(获取cookie)
    2.在发起个人主页请求时,需要将cookie携带到请求中
    注意:session对象:发送请求
    python爬虫 - 图9">创建文件夹
    if not os.path.exists(‘./pages’):
    os.mkdir(‘./pages’)

    word = input(‘enter a word:’)
    #动态指定页码的范围
    start_pagenum = int(input(‘enter a start pageNum:’))
    end_pageNum = int(input(‘enter a end pageNum:’))
    #请求头信息
    headers = {
    ‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
    }
    #指定url,设计成一个具有通用的url
    url = ‘https://zhihu.sogou.com/zhihu
    for page in range(start_pagenum,end_pageNum+1):
    param = {
    ‘query’:word,
    ‘page’:page,
    ‘ie’:’utf-8’
    }
    response = requests.get(url=url,params=params,headers=headers)
    #获取相应中的页面数据(指定页面(page))
    page_text = respomse.text
    #持久化
    fileName = word +str(page)+’.html’
    filePath = ‘pages/‘+fileName
    with open(filePath,’w’,encoding=’utf-8’) as fp:
    fp.write(page_text)
    print(‘第%d页写入成功’%page)
    python爬虫 - 图10
    Requests – cookie
    —cookie
    基于用户的用户数据
    -需求:爬取张三用户的豆瓣网上的个人主页页面数据
    —cookie作用:
    1.执行登陆操作(获取cookie)
    2.在发起个人主页请求时,需要将cookie携带到请求中
    注意:session对象:发送请求
    python爬虫 - 图11
  • 三种数据解析方式
  • Scrapy框架

  • #创建爬虫文件">创建爬虫项目
    python爬虫 - 图12
    #创建爬虫文件


Python网络爬虫


作者:地铁昌平线
归档:学习笔记
2019/02/26
快捷键:
Ctrl + 1 标题1
Ctrl + 2 标题2
Ctrl + 3 标题3
Ctrl + 4 实例
Ctrl + 5 程序代码
Ctrl + 6 正文
格式说明:
蓝色字体:注释
黄色背景:重要
绿色背景:注意

Python爬虫的分类

通用爬虫:

通用爬虫是搜索引擎BaiDu Google YaHoo等,抓取的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。

聚焦爬虫

是根据指定的需求抓取网络上的数据

Robots.txt协议

自己的门户网站中的指定页面中的数据不想让爬虫程序取到的化,那么则可以通过编写一个robots.txt的协议文件来约束爬虫程序的数据爬取

反爬虫

门户网站通过相应的策略和技术手段,放置爬虫程序进行网站数据的爬取

反反爬虫

爬虫程序通过相应的策略和技术的手段,破解门户网站的反爬虫手段,从而爬取到相应的数据

什么是Jupyter Notebook

简介

Jupyter Notebook是基于网页的用于交互式计算的应用程序,期可被应用用全过程编码开发,文档编写,运行代码和展示结果

Jupyter Notebook的主要特点

  1. 编写时具有语法高亮、缩进、tab补全的功能
  2. 可直接通过浏览器运行代码,同时在代码块下放展示运行的结果
  3. 对代码编写说明文档或语句时,支持Markdown语法

安装

安装前提:
安装Jupter Noteboo的前提需要安装python3.3版本或2.7以上的版本
使用Anaconda安装
通过安装Anacida来解决Jupter NoteBoo的安装问题
官方下载地址: www.anaconda.com/download 自行下载,傻瓜式安装,默认配置环境变量
运行Jupyter Notebook
Jupyter notebook
python爬虫 - 图13

使用介绍

python爬虫 - 图14
常用快捷键
向下插入一个cell b
向上插入一个cell a
将cell的类型切换成Markdown类型 m
将cell的类型切换成code类型 y
运行 shift + enter
帮助文档 Shift + Tab
补全 tab

网络爬虫模块

Urlib

Python中自带的一个基于爬虫的模块。
作用:可以使用代码模拟浏览器发起请求.request parse
使用流程:
指定url
发起请求
获取页面数据
持久化存储

需求 爬取搜狗首页数据
#需求爬取搜狗首页
import urllib.request
#1.指定url
url = ‘https://www.sogou.com/
#2.发请求,urlopen可以根据指定的url发起请求,且返回一个响应对象
response = urllib.request.urlopen(url=url)
#3.获取页面数据:read函数返回的就是响应对象中存储的页面数据(byte)
page_text = response.read()
#4.持久化存储
with open(‘./sogou.html’,’wb’) as fp:
fp.write(page_text)
print(‘写入数据成功’)
python爬虫 - 图15
#需求:爬取指定词条所对应的页面数据
import urllib.request
import urllib.parse
#指定url
url = ‘https://www.sogou.com/web?query=
#url的特性:url不可以存在非ASCII编码的字符数据
word = urllib.parse.quote(‘范冰冰’)
url += word #有效的url
#发送请求
response = urllib.request.urlopen(url=url)

获取页面数据
page_text = response.read()
print(page_text)

将获取的数据做持久化存储
page_text = response.read()
with open(‘fanbingbing.html’,’wb’) as fp:
fp.write(page_text)
print(‘写入成功’)

python爬虫 - 图16

反爬机制

-反爬虫机制:网站会检查请求的UA,如果发现请求的UA是爬虫程序,则拒绝提供网站数据
-User-Agent(UA):请求载体的身份标识
-反反爬机制:伪装爬虫程序请求的UA,
UA伪装
import urllib.request
url = ‘http://www.baidu.com/
#UA伪装
#1.自制定一个请求的对象
headers = {
#存储任意的请求头信息
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
}
#该请求对象的UA进行了成功的伪装

request = urllib.request.Request(url=url,headers=headers)
#2.针对自制定的请求对象发起请求
response = urllib.request.urlopen(request)
print(response.read())
python爬虫 - 图17

Post请求

import urllib.request
import urllib.parse
#指定url
url = ‘https://fanyi.baidu.com/sug
#post请求携带的参数进行处理 流程:
#1.将POST 请求参数封装到字典
data = {
‘kw’:’西瓜’
}
#2。使用parse模块中的urlencode(返回值类型为str)进行编码处理
data = urllib.parse.urlencode(data)
type(data)
#3.将步骤2的编码结果转换成byte类型
data = data.encode()
#2.发起post请求:urlopen函数的data参数表示的就是经过处理之后的post请求携带的参数
response = urllib.request.urlopen(url=url,data=data)
response.read()
python爬虫 - 图18
python爬虫 - 图19

Urllib操作

代理操作

什么是代理:代理就是第三方代替本体处理相关
代理分类:
正向代理:代理客户端获取数据,正向代理是为了保护客户端防止被追究责任
反响代理:代理服务端提供数据,反向代理为了保护服务器或负载均衡

Requests模块

  1. 什么是requests模块

Python原生一个基于网络请求的模块,模拟浏览器发起请求。

  1. 为什么要使用requests模块
  2. 自带处理url编码,
  3. 自动处理post请求的参数urlencode()
  4. 简化Cookie的代理的操作

创建一个cookiejar对象
创建一个handler对象
创建一个openrner

创建一个handler对象,代理IP和端口封装到该对象
创建openner对象
3.requests如何被使用
安装:pip install requests
使用流程:

  1. 指定url
  2. 使用requests模块发起请求
  3. 获取响应数据
  4. 进行持久化存储

基于requests模块

—爬取搜狗首页
import requests
url = ‘https://www.sogou.com/
#发起get请求:get 方法会返回请求成功后的响应对象
response = requests.get(url=url)
#获取响应中的数据值,text可以获取响应对象中的字符串形式页面的数据
page_data = response.text
print(page_data)
#持久化操作
with open(‘./sogou.html’,’w’,encoding=’utf-8’) as fp:
fp.write(page_data)

Response对象中其他重要的属性
#response对象中其他重要的属性
import requests
url = ‘https://www.sogou.com/
#发起get请求:get 方法会返回请求成功后的响应对象
response = requests.get(url=url)
#获取响应中的数据值,text可以获取响应对象中的字符串形式页面的数据
#content获取的是response对象中二进制类型的数据
# print (response.content)

返回一个状态码
#print(response.status_code)

返回相应头信息
# print(response.headers)

获取请求的url
print(response.url)
Requests如何请求携带参数的get请求
-方式一
python爬虫 - 图20
方式二
python爬虫 - 图21

Requsts模块get请求自定义请求头信息
#自定义请求头信息
import requests

url = ‘https://sogou.com/web

将参数封装到字典中
params = {
‘query’:’周杰伦’,
‘ie’:’utf-8’
}
#自定义请求头信息
headers = {
‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
}
response = requests.get(url=url,params=params,headers=headers)
response.status_code
基于requests模块发起的post请求
#基于requests模块发起的post请求
#- 需求:登陆豆瓣网,获取登陆成功后的页面数据
import requests
url = ‘https://accounts.douban.com/login
#封装post请求的参数
data = {
‘source’:’movie’,
‘redir’:’https://movie.douban.com/‘,
‘form_email’:’18401747334’,
‘form_password’:’fei@163.com’,
‘login’:’登录’,
}
#自定义请求头信息
headers = {
‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
}
#发起post请求
respomse = requests.post(url=url,data=data,headers=headers)
#获取响应对象中的页面数据
page_text = respomse.text
#持久化
with open(‘./douban.html’,’w’,encoding=’utf-8’) as fp:
fp.write(page_text)
Requests模块ajax的get请求、
#基于ajax的get请求
import requests
url = ‘https://movie.douban.com/j/chart/top_list?
#封装ajax的get请求中携带的参数
params = {
‘type’: ‘13’,
‘interval_id’: ‘100:90’,
‘action’: ‘’,
‘start’: ‘10’,
‘limit’: ‘20’
}
#请求头信息
headers = {
‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
}
respomse = requests.get(url=url,params=params,headers=headers)
print(respomse.text)
python爬虫 - 图22
基于ajax的post请求
python爬虫 - 图23
#基于ajax的post请求
#需求:爬取肯德基城市餐厅位置数据
import requests
#指定url
post_url = ‘http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword
#post请求的参数
data = {
‘cname’: ‘’,
‘pid’: ‘’,
‘keyword’: ‘杭州’,
‘pageIndex’: ‘1’,
‘pageSize’: ‘10’
}
#自定义请求头
headers = {
‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
}
#发起基于ajax的post请求
response = requests.post(url=post_url,headers=headers,data=data)
response.text

Requests模块综合学习

获取前3页
import requests
import os

创建文件夹
if not os.path.exists(‘./pages’):
os.mkdir(‘./pages’)

word = input(‘enter a word:’)
#动态指定页码的范围
start_pagenum = int(input(‘enter a start pageNum:’))
end_pageNum = int(input(‘enter a end pageNum:’))
#请求头信息
headers = {
‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’
}
#指定url,设计成一个具有通用的url
url = ‘https://zhihu.sogou.com/zhihu
for page in range(start_pagenum,end_pageNum+1):
param = {
‘query’:word,
‘page’:page,
‘ie’:’utf-8’
}
response = requests.get(url=url,params=params,headers=headers)
#获取相应中的页面数据(指定页面(page))
page_text = respomse.text
#持久化
fileName = word +str(page)+’.html’
filePath = ‘pages/‘+fileName
with open(filePath,’w’,encoding=’utf-8’) as fp:
fp.write(page_text)
print(‘第%d页写入成功’%page)
python爬虫 - 图24
Requests – cookie
—cookie
基于用户的用户数据
-需求:爬取张三用户的豆瓣网上的个人主页页面数据
—cookie作用:
1.执行登陆操作(获取cookie)
2.在发起个人主页请求时,需要将cookie携带到请求中
注意:session对象:发送请求
python爬虫 - 图25

  1. -代理操作:<br />为什么使用代理?
  • 反爬操作
  • 反反爬虫手段

分类:
正向代理:代替客户端获取数据
反向代理:代理服务端提供数据
免费代理ip的网站提供商
www.goubanjia.com
快代理
西祠代理
python爬虫 - 图26

三种数据解析方式

数据解析

指定url
发起请求
获取数据
数据解析
持久化存储

三种数据解析方式

正则

Bs4
python爬虫 - 图27

Xpath
安装xpath插件:就可以直接将xpath表达式作用于浏览器的网页当中
python爬虫 - 图28

动态页面加载

  1. seleniun
  2. phantomJs

python爬虫 - 图29
python爬虫 - 图30

Scrapy框架

python爬虫 - 图31
python爬虫 - 图32

python爬虫 - 图33

创建爬虫项目
python爬虫 - 图34
#创建爬虫文件

python爬虫 - 图35
#编写爬虫文件
python爬虫 - 图36
修改setting的19行的AU和22行的ROBOTSTXT_OBEY默认是true 改成False不让他遵循ROBOTS协议
python爬虫 - 图37
启动>scrapy crawl qiubai –nolog

持久化存储

持久化存储操作
A 磁盘文件
基于终端指令:
保证parse方法返回一个可迭代类型的对象(存储解析到页面内容)
使用终端指令完成数据存储到指定的文件当中

-o 指定的磁盘文件 –nolog 不输出日志
python爬虫 - 图38
python爬虫 - 图39
基于管道的数据存储

  1. items:存储解析到的页面数据
  2. pipelines:处理解析持久化存储相关操作
  3. 基于mysql
  4. 基于redis存储

需求:将爬取到