龙空技术网

「收藏向」一文搞懂Python爬虫必备知识点

DeepData 106

前言:

眼前同学们对“python爬虫header的location”大约比较注意,朋友们都需要知道一些“python爬虫header的location”的相关知识。那么小编在网摘上汇集了一些关于“python爬虫header的location””的相关内容,希望大家能喜欢,看官们一起来了解一下吧!

本文略长,建议先收藏,以后慢慢看,或者当工具使用,以后如果有哪里不清楚,可以在网页端Ctrl+F搜索关键字查询。

开发爬虫的步骤:

-目标数据

-网站

-页面

-分析数据加载流程

-分析目标数据所对应的url

-下载数据

-清洗,处理数据

-数据持久化

requests 库:

r = requests.get(";) #向服务器发送get请求

r = requests.get(url,params=None,**kwags)

Response 对象的属性:

r.stastus_code http请求的返回状态,200表示连接成功,404表示失败

r.text http响应内容的字符串形式,即,url对应的页面内容

r.encoding 从http header中猜测的响应内容编码方式(如果header中不存在charset,则认为编码为ISO-8859-1)

r.apparent_encoding 从内容中分析出的响应内容编码方式(根据网页内容分析出的编码方式)

r.content http响应内容的二进制形式

爬取网页的通用代码框架:

理解Requests库的异常

requests.ConnectionError 网络连接错误异常,如DNS查询失败,拒绝连接等

requests.HTTPError HTTP错误异常

requests.URLRequired URL缺失异常

requests.TooManyRedirects 超过最大重定向次数,产生重定向异常

requests.ConnectTimeout 连接远程服务器超时异常

requests.Timeout 请求url超时,产生超时异常

r.raise_for_status() 如果不是200,产生异常requests.HTTPError

Requests库的7个主要方法:

requests.request( ) 构造一个请求,支撑以下各方法的基础方法

requests.get( ) 获取HTML网页的主要方法,对应于HTTP的GET

requests.head( ) 获取HTML网页头信息的方法,对应于HTTP的HEAD

requests.post( ) 向HTML网页提交POST请求的方法,对应于HTTP的POST

requests.put ( ) 向HTML网页提交PUT请求的方法,对应于HTTP的PUT

requests.patch( ) 向HTML网页提交局部修改请求,对应于HTTP的PATCH

requests.delete( ) 向HTML页面提交删除请求,对应于HTTP的DELETE

HTTP协议(超文本传输协议),是一个基于“请求与响应”模式的,无状态的应用层协议,采用URL作为定位网络资源的标识。

URL格式 [:port][path]

host:合法的internet主机域名或IP地址

post:端口号,缺省端口为80

path:请求资源的路径

HTTP URL 的理解:

URL 是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。

HTTP协议对资源的操作:

GET 请求获取URL位置的资源

HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息

POST 请求向URL位置的资源后附加新的数据

PUT 请求向URL位置存储一个资源,覆盖原URL位置的部分内容

PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容

DELETE 请求删除URL位置存储的资源

爬取网页的通用代码框架:

try:

r = requests.get(url,timeout=30)

r.raise_for_status() #如果返回的信息状态码不是200,会产生一次异常

r.encoding = r.apparent_encoding

return r.text

except:

return”产生异常”

网络爬虫的尺寸:

爬取网页 小规模,数据量小,爬取速度不敏感 Requests库

爬取网站 中规模,数据量大,爬取速度敏感 Scrapy库

爬取全网 大规模,搜索引擎,爬取速度关键

网络爬虫的限制:

1.来源审查:判断User-Agent进行限制

检查来访http协议头的User-Agent域,只响应浏览器或友好爬虫的访问

2.发布公告:Robots协议

作用---网站告知网络爬虫哪些页面可以爬取,哪些不行

形式---在网站根目录下的robots.txt文件

BeautifulSoup库的使用方法:

from bs4 import BeautifulSoup

soup = BeautifulSoup(”<p>data</p>”, ”html.parser”)

BeautifulSoup库是解析,遍历,维护“标签树”的功能库。(个人理解,先发送请求

r = requests.get(";),定义demo为该页面内容demo = r.text,将demo煮成汤soup = BeautifulSoup(demo,"html.parser"))

BeautifulSoup类的基本元素:

Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾

Name 标签的名字,<p>...</p>的名字是”p”,格式:<tag>.name

Attributes 标签的属性,字典形式组织,格式:<tag>.attrs

NavigableString 标签内非属性字符串,<>...</>中字符串,格式:<tag>.string

Comment 标签内字符串的注释部分,一种特殊的Comment类型

HTML基本格式:

<html>

<head>

<title>This is a python demo page</title>

</head>

<body>

<p class="title">

<b>The demo python introduces several python courses.</b>

</p>

<p class="course">Python is a wonderful general-purpose programming language.

You can learn Python from novice to professional by tracking the following courses:

<a href="; class="py1" id="link1">Basic Python</a> and

<a href="; class="py2" id="link2">Advanced Python</a>.

</p>

</body>

</html>

标签树的下行遍历:

.contents 子节点的列表,将<tag>所有儿子节点存入列表

.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点

.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

标签树的上行遍历:

.parent 节点的父亲标签

.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点

标签树的平行遍历:

.next_sibling 返回按照HTML文本顺序的下一个平行节点标签

.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签

.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签

.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

prettify()函数可以给html文本的标签以及内容增加换行符.

信息的标记:

1. 标记后的信息可形成信息组织结构,增加了信息维度

2. 标记后的信息可用于通信、存储或展示

3. 标记的结构与信息一样具有重要价值

4. 标记后的信息更利于程序理解和运用

信息标记的三种形式:

1. XML # 用<>和标签表达信息

2. JSON # 用有类型的键值对” key”:”value”表达信息

3. YAML # 用无类型的键值对key:value表达信息

三种信息标记形式的比较:

1. XML

最早的通用信息标记语言,可拓展性好,但繁琐

Internet上的信息交互与传递

2. JSON

信息有类型,适合程序处理(js),较XML简洁

移动应用云端和节点的信息通信,无注释

3. YAML

信息无类型,文本信息比例最高,可读性好

各类系统的配置文件,有注释易读

信息提取的一般方法:

方法一:

完整解析信息的标记形式,再提取关键信息

XML JSON YAML

需要标记解析器 例如: bs4库的标签树遍历

优点 : 信息解析准确

缺点 :提取过程繁琐,速度慢

方法二:

无视标记形式,直接搜索关键信息

搜索

对信息的文本查找函数即可

优点:提取过程简洁,速度较快

缺点:提取结果准确性与信息内容相关

融合方法:

结合形式解析与搜索方法,提取关键信息

XML JSON YAML 搜索

需要标记解析器及文本查找函数

<>.find_all(name,attrs,recursive,string,**kwargs)

返回一个列表类型,存储查找的结果。

name : 对标签名称的检索字符串

attrs :对标签属性值的检索字符串,可标注属性检索

recursive : 是否对子孙全部检索,默认True

拓展方法:

<>.find

搜索且只返回一个结果,字符串类型,同.find_all()参数

<>.find_parents()

在先辈节点中搜索,返回列表类型,同.find_all()参数

<>.find_parent()

在先辈节点中返回一个结果,字符串类型,同.find()参数

<>.find_next_siblings()

在后续平行节点中搜索,返回列表类型,同.find_all()参数

<>.find_next_sibling()

在后续平行节点中返回一个结果,字符串类型,同.find()参数

<>.find_previous_siblings

()在前序平行节点中搜索,返回列表类型,同.find_all()参数

<>.find_previous_sibling

() 在前序平行节点中返回一个结果,字符串类型,同.find()参数

正则表达式: 正则表达式是用来简洁表达一组字符串的表达式

1. 通用的字符串表达框架

2. 简洁表达一组字符串的表达式

3. 针对字符串表达“简洁”和“特征”思想的工具

正则表达式主要应用在字符串匹配中

正则表达式的使用:

编译:将符合正则表达式语法的字符串转换成正则表达式特征。

正则表达式的表示类型:

raw string类型(原生字符串类型) r“text”

string类型,更繁琐

经典正则表达式实例:

^[A-Za-z]+$ 由26个字母组成的字符串

^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串

^-?\d+$ 整数形式的字符串

^[0-9]*[1-9][0-9]*$ 正整数形式的字符串

[1-9]\{d5} 中国境内邮政编码,6位

[\u4e00-\u9fa5] 匹配中文字符

\d{3}-\d{8}|\d{4}-\d{7} 国内电话号码

Re库主要功能函数:

re.search(pattern,string,flags=0)

在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象

pattern : 正则表达式的字符串或原生字符串表示

string : 待匹配字符串

flags : 正则表达式使用时的控制标记

常用标记

re.match(pattern,string,flags=0)

从一个字符串的开始位置起匹配正则表达式,返回match对象

pattern : 正则表达式的字符串或原生字符串表示

string : 待匹配字符串

flags : 正则表达式使用时的控制标记

re.findall(pattern,string,flags=0)

搜索字符串,以列表类型返回全部能匹配的子串

pattern : 正则表达式的字符串或原生字符串表示

string : 待匹配字符串

flags : 正则表达式使用时的控制标记

re.split(pattern,string,maxsplit=0,flags=0)

将一个字符串按照正则表达式匹配结果进行分割,返回列表类型

pattern : 正则表达式的字符串或原生字符串表示

string : 待匹配字符串

maxsplit: 最大分割数,剩余部分作为最后一个元素输出

flags : 正则表达式使用时的控制标记

re.finditer (pattern,string,flags=0)

搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象

pattern : 正则表达式的字符串或原生字符串表示

string : 待匹配字符串

flags : 正则表达式使用时的控制标记

re.sub(pattern,repl,string,count=0,flags=0)

在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

pattern : 正则表达式的字符串或原生字符串表示

repl : 替换匹配字符串的字符串

string : 待匹配字符串

count : 匹配的最大替换次数

flags : 正则表达式使用时的控制标记

Re库的两种用法:

1. 函数式用法:一次性操作

rst = re.search(r“[1-9]\d{5}”,“BIT 100081”)

2. 面向对象用法:编译后的多次操作

pat = re.compile(r“[1-9]\{d5}”)

rst = pat.search(“BIT 100081”)

regex = re.compile(pattern,flags=0)

将正则表达式的字符串形式编译成正则表达式对象

pattern : 正则表达式的字符串或原生字符串表示

flags : 正则表达式使用时的控制标记

Re库的另一种等价用法:

Match对象的属性:

Match对象的方法:

贪婪匹配:

Re库默认采用贪婪匹配,即输出匹配最长的子串

最小匹配操作符:

Scrapy 框架:

爬虫框架:

是实现爬虫功能的一个软件结构和功能组件集合。

是一个半成品,能够帮助用户实现专业网络爬虫。

Scrapy爬虫框架结构:

Engine:

1. 控制所有模块之间的数据流

2. 根据条件触发事件

Downloader:

1. 根据请求下载网页

2. 不需要用户修改

Scheduler:

1. 对所有爬取请求进行调度管理

2. 不需要用户修改

Downloader Middleware:

目的:实施Engine、Scheduler和Downloader之间进行用户可配置的控制

功能:修改、丢弃、新增请求或响应

用户可以编写配置代码

Spider:

1. 解析Downloader返回的响应(Response)

2. 产生爬取项(scraped item)

3. 产生额外的爬取请求(Request)

Item Pipelines:

1. 以流水线方式处理Spider产生的爬取项

2. 由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型

3. 可能操作包括:清理、检验和查重爬取项中的HTML数据、将数据存储到数据库

Spider Middleware:

目的:对请求和爬取项的再处理

功能:修改、丢弃、新增请求或爬取项

用户可以编写配置代码

requests vs. Scrapy

相同点:

1. 两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线

2. 两者可用性都好,文档丰富,入门简单

3. 两者都没有处理js、提交表单、应对验证码等功能(可扩展)

不同点:

Scrapy 命令行:Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行。

Scrapy命令行格式:

>scrapy<command>[options][args]

Scrapy常用命令:

为什么Scrapy采用命令行创建和运行爬虫?

1. 命令行(不是图形界面)更容易自动化,适合脚本控制。

2. 本质上,Scrapy是给程序员用的,功能(而不是界面)很重要。

产生步骤(举个例子):

1. 建立一个Scrapy爬虫工程

打开cmd,定位到 e:\pycodes

输入scrapy startproject python123demo

生产的工程目录:

python123demo/ 外层目录

scrapy.cfg 部署Scrapy爬虫的配置文件

python123demo/ Scrapy框架的用户自定义Python代码

_init_.py 初始化脚本

items.py Items代码模板(继承类)

middlewares.py Middlewares代码模板(继承类)

pipelines.py Pipelines代码模板(继承类)

settings.py Scrapy爬虫的配置文件

spiders/ Spiders代码模板目录(继承类)

2. 在工程中产生一个Scrapy爬虫

cmd定位到e:\pycodes\python123demo

输入 scrapy genspider demo python123.io

在Spider文件夹会生成demo.py文件

demo.py文件:

# -*- coding: utf-8 -*-import scrapyclass DemoSpider(scrapy.Spider):    name = 'demo'    allowed_domains = ['python123.io']    start_urls = [';]    def parse(self, response):        pass

3. 配置产生的spider爬虫(修改代码)

4. 运行爬虫,获取网页

打开cmd,定位e:\pycodes\python123demo

输入scrapy crawl demo

yield关键字←→生成器

1. 生成器是一个不断产生值的函数

2. 包含yield的语句的函数是一个生成器

3. 生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值

为何会有生成器?

1. 更节省存储空间

2. 响应更迅速

3. 使用更灵活

Scrapy爬虫的使用步骤:

1. 创建一个工程和Spider模板

2. 编写Spider

3. 编写Item Pipeline

4. 优化配置策略

Scrapy爬虫的数据类型:

1. Requests类

class scrapy.http.Request()

Request对象表示一个HTTP请求

由Spider生成,由Downloader执行

2. Response类

class scrapy .http.Response()

Response对象表示一个HTTP响应

由Downloader生成,由Spider处理

3. Item类

class scrapy.item.Item()

Item对象表示一个从HTML页面中提取的信息的内容

由Spider生成,由Item Pipeline处理

Item类似字典类型,可以按照字典类型操作

Scrapy爬虫提取信息的方法:

Scrapy爬虫支持多种HTML信息提取方法。

BeautifulSoup

lxml

re

Xpath Selector

CSS Selector

CSS Selector的基本使用:

<HTML>.css(“a::attr(href)”).extract()

配置并发连接选项:

settings.py

回顾与总结:

技术路线:

requests-bs4-re

scrapy(5+2结构)

标签: #python爬虫header的location