前言:
眼前同学们对“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结构)