Python网络爬虫


 

Python网络爬虫

 

作者:songyifei

归档:学习笔记

2019/02/26

快捷键:

Ctrl + 1    标题1

Ctrl + 2    标题2

Ctrl + 3    标题3

Ctrl + 4    实例

Ctrl + 5    程序代码

Ctrl + 6    正文

格式说明:

蓝色字体:注释

黄色背景:重要

绿色背景:注意


第1章   Python爬虫的分类

1.1 通用爬虫:

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

1.2 聚焦爬虫

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

1.3 Robots.txt协议

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

1.4 反爬虫

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

1.5 反反爬虫

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

 

第2章 什么是Jupyter Notebook

2.1 简介

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

 

Jupyter Notebook的主要特点

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

2.2 安装

安装前提:

安装Jupter Noteboo的前提需要安装python3.3版本或2.7以上的版本

使用Anaconda安装

    通过安装Anacida来解决Jupter NoteBoo的安装问题

    官方下载地址: www.anaconda.com/download 自行下载,傻瓜式安装,默认配置环境变量

运行Jupyter Notebook

    Jupyter notebook

 

2.3 使用介绍

 

常用快捷键

    向下插入一个cell b

    向上插入一个cell a

将cell的类型切换成Markdown类型 m

将cell的类型切换成code类型   y

运行  shift + enter

帮助文档 Shift + Tab

补全 tab

第3章 网络爬虫模块

3.1 Urlib

Python中自带的一个基于爬虫的模块。

作用:可以使用代码模拟浏览器发起请求.request parse

使用流程:

    指定url

    发起请求

    获取页面数据

    持久化存储

实例3-1  需求 爬取搜狗首页数据

#需求爬取搜狗首页

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('写入数据成功')

 

#需求:爬取指定词条所对应的页面数据

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('写入成功')

 

 

3.2 反爬机制

-反爬虫机制:网站会检查请求的UA,如果发现请求的UA是爬虫程序,则拒绝提供网站数据

    -User-Agent(UA):请求载体的身份标识

    -反反爬机制:伪装爬虫程序请求的UA,

实例3-2  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())

 

3.3 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()

 

 

3.4 Urllib操作

3.4.1 代理操作

什么是代理:代理就是第三方代替本体处理相关

代理分类:

    正向代理:代理客户端获取数据,正向代理是为了保护客户端防止被追究责任

    反响代理:代理服务端提供数据,反向代理为了保护服务器或负载均衡

3.5 Requests模块

1、 什么是requests模块

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

2、 为什么要使用requests模块

  1. 自带处理url编码,
  2. 自动处理post请求的参数urlencode()
  3. 简化Cookie的代理的操作

创建一个cookiejar对象

创建一个handler对象

创建一个openrner

 

创建一个handler对象,代理IP和端口封装到该对象

创建openner对象

3.requests如何被使用

安装:pip install requests

使用流程:

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

3.6 基于requests模块

实例3-3  —爬取搜狗首页

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)

   

实例3-4  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)

实例3-5  Requests如何请求携带参数的get请求

-方式一

 

方式二

 

实例3-6  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

实例3-7  基于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)

实例3-8  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)

 

实例3-9  基于ajax的post请求

 

#基于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

3.7 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)

 

实例3-10            Requests – cookie

--cookie

基于用户的用户数据

-需求:爬取张三用户的豆瓣网上的个人主页页面数据

              --cookie作用:

                            1.执行登陆操作(获取cookie)

                            2.在发起个人主页请求时,需要将cookie携带到请求中

                            注意:session对象:发送请求

 

               -代理操作:

为什么使用代理?

-          反爬操作

-          反反爬虫手段

分类:

              正向代理:代替客户端获取数据

              反向代理:代理服务端提供数据

               免费代理ip的网站提供商

                            www.goubanjia.com

                            快代理

                            西祠代理

 

第4章 三种数据解析方式

4.1 数据解析

指定url

发起请求

获取数据

数据解析

持久化存储

4.2 三种数据解析方式

正则

 

Bs4

 

 

Xpath


安装xpath插件:就可以直接将xpath表达式作用于浏览器的网页当中

 

4.3 动态页面加载

  1. seleniun
  2. phantomJs

 

 

第5章 Scrapy框架

 

 

 

实例5-1   

#创建爬虫项目

 

#创建爬虫文件

 

 

#编写爬虫文件

 

修改setting的19行的AU和22行的ROBOTSTXT_OBEY默认是true 改成False不让他遵循ROBOTS协议

 

启动>scrapy crawl qiubai –nolog

5.1.2 持久化存储

持久化存储操作

A 磁盘文件

    基于终端指令:

    保证parse方法返回一个可迭代类型的对象(存储解析到页面内容)

    使用终端指令完成数据存储到指定的文件当中

  

-o 指定的磁盘文件 –nolog 不输出日志

 

 

实例5-2  基于管道的数据存储

  1. items:存储解析到的页面数据
  2. pipelines:处理解析持久化存储相关操作
  3. 基于mysql
  4. 基于redis存储
原文地址:https://www.cnblogs.com/sseban/p/10577182.html