Python爬虫
2018-04-10 09:20:29 105 举报
AI智能生成
登录查看完整内容
Python-爬虫
作者其他创作
大纲/内容
Python爬虫知识
常用操作
requests库使用
示例
import requestsresponse = requests.get('http://httpbin.org/get?name=lu&age=2')print(response.text)
urllib库使用
常用使用模块
urllib.request
urllib.error
urllib.parse
urllib.robotparser
import urllib.requesturl = 'http://blog.csdn.net/weiwei_pig/article/details/51178226'file = urllib.request.urlopen(url)print(file.getcode())
url编码
设置超时
urlopen()不支持一些HTTP的高级功能所以需要修改报头
添加header
使用build_opener()修改报头
headers = (\"User-Agent\
使用add_header()添加报头
HTTP协议请求
6大种类
GET请求
构建方法
1.构建对应的URL地址,http://网址?字段名1=字段内容&字段名2=字段内容22.以对应的URL为参数,构建Reqeuest对象3.通过urlopen()打开构建的Request对象4.按需要进行后续的处理操作
POST请求
1.设置好URL网址2.构架表单数据,并使用urllib.parse.urlencode对数据进行编码处理3.创建Request对象,参数包括URL地址和要传递的数据4.使用add_header()添加头信息,模拟浏览器进行爬取5.使用urllib.request.urlopen()打开对应的Request对象,完成信息的传递6.后续处理,比如读取网页内容,将内容写入文件等
import urllib.requestimport urllib.parseurl = 'http://www.iqianyue.com/mypost/'postdata = urllib.parse.urlencode({ \"name\": \"ceo@iqianyue.com\
PUT请求
请求服务器存储一个资源,通常指定存储的位置
DELETE请求
请求服务器删除一个资源
HEAD请求
请求获取对应的HTTP报头信息
OPTIONS请求
获得当前URL所支持的请求类型
代理服务器
网址
代理服务器的设置http://yum.iqianyue.com/proxy
开启DebugLog模式
异常处理-URLError
原因
1.连接不上服务器2.远程URL不存在3.无网络4.触发了HTTPError
异常代码值
200 ok301 Move Permanently 重定向到新的url,永久性302 Found 重定向到临时的url,非永久性304 not modified 请求的资源未更新400 bad request 非法请求401 Unauthorized 请求未经授权403 Forbidden 禁止访问404 not found 没有找到对应页面500 服务器内部出现错误501 服务器不支持实现请求所需要的功能
正则表达式
种类
原子
概念
原子是正则表达式的最基本的组成单位,每个正则表达式中至少要包含一个原子
1.普通字符作为原子
import re# 普通字符作为原子pattern = 'yue'string = \"http://yum.iqianyue.com\
2.非打印字符为原子
3.通用字符作为原子
# 通用字符作为原子# 一个原子可以匹配一类字符# \\w 匹配任意一个字母,数字或下划线# \\W 匹配除字母,数字和下划线以外的任意一个字符# \\d 匹配任意一个十进制# \\D 匹配除十进制以外的任意一个其他字符# \\s 匹配任意一个空白字符# \\S 匹配除空白字符以外的任意一个其他字符pattern = \"\\w\\dpython\\w\
4.原子表
# 原子表# 可以定义组地位平等的原子,然后匹配的时候会取该原子表中的任意一个原子进行匹配pattern1 = \"\\w\\dpython[xyz]\\w\"pattern2 = \"\\w\\dpython[^xyz]\\w\" #[^]代表除了括号里面的原子均可以匹配pattern3 = \"\\w\\dpython[xyz]\\W\"string = \"abcdfphp345pythony_py\
元字符
限定符
边界限制元字符
# 边界限制元字符# 使用^匹配字符串开始,使用$匹配字符串的结束pattern1 = \"^abd\" # 必须以abd开头pattern2 = \"^abc\" # 必须以abc开头pattern3 = \"py$\" # 必须以py结尾pattern4 = \"ay$\" # 必须以ay结尾string = \"abcdfphp345pythony_py\
常见的元字符
import repattern = '.python...' # 前面有1位,后面有3位格式的字符(除了换行符以外任意字符)string = \"abcdfphp345python_py\
模式选择符
# 模式选择符import repattern = \"python|php\" #python和php均满足条件string = \"abcdfphp345pythony_py\
模式单元符
# 模式单元符pattern1 = \
模式修正
模式修正可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整I 匹配时候忽略大小写M 多行匹配L 做本地化识别匹配U 根据Unicode字符及解析字符S 让.匹配包括换
import repattern1 = \"python\"pattern2 = \"python\"string = \"abcdfphp345Pythony_py\
贪婪模式与懒惰模式
贪婪模式
尽可能多地匹配
懒惰模式
尽可能少地匹配
# 贪婪模式,懒惰模式import repattern1 = \"p.*y\" # 贪婪模式 默认使用贪婪模式pattern2 = \"p.*?y\" # 懒惰模式 在.*后面加上?string = \"abcdfphp345pythony_py\
常见函数
re.match()函数
从源字符串的开头进行匹配
import restring = \"apythonhellomypythonhispythonourpythonend\"pattern = \".python.\
.re.search()函数
会在全文中进行检索匹配
import restring = \"pythonhellomypythonhispythonourpythonend\"pattern = \".python.\
全局匹配函数
方法
全局匹配函数源字符串中有多个结果符合模式,希望符合模式的内容全部都匹配出来1.使用re.complie()对正则表达式进行预编译2.编译后,使用finall()根据正则表达式从源字符串中将匹配的结果全部找出
import restring = \"hellomypythonhispythonourpythonend\"pattern = re.compile(\".python.\
re.sub函数
根据正则表达式来实现替换某些字符串的功能
import restring = \"hellomypythonhispythonoutpythonend\"pattern = \"python.\
网址匹配
# 匹配网址import repattern = \"[a-zA-Z]+://[^\\s]*[.com|.cn]\"string = \"<\\a href='http://www.baidu.com'>百度首页<\\/a>\
匹配电话号码
import repattern = \"\\d{4}-\\d{7}|\\d{3}-\\d{8}\" # 匹配电话号码的正则表达式string = \"021-672826353682382265236\
匹配电子邮件
import repattern = \"\\w+([.+-]\\w+)*@\\w+([.-]\\w+)*\\.\\w+([.-]\\w+)*\"string = \"<\\a href='http://www.baidu.com'>百度首页<\\/a><\\a href='mailto:c-e+o@iqi-anyue.com.cn'>电子邮件地址<\\/a>\
re库正则表达式使用
对字符串的一种过滤逻辑
需要信息在js中,使用正则表达式
解析日志信息使用正则表达式
Cookie
HTTP协议是无状态协议,(无状态协议即无法维持会话之间的状态)
保存信息方法
Cookie保存会话
Session保存会话信息
Python版本
在Python3中使用Cookiejar库进行处理在Python2中使用Cookielib库进行处理
常用思路
1.导入Cookie处理模块http.cookiejar2.使用http.cookiejar.CookieJar()创建CookieJar对象3.使用HTTPCookieProcessor创建cookie处理器,并以其为参数构建opener对象4.创建全局默认的opener对象
# 希望登录状态一直保持,使用Cookie处理import http.cookiejar# 使用http.cookiejar.CookieJar()创建CookieJar对象cjar = http.cookiejar.CookieJar()# 使用HTTPCookieProcessor创建cookie处理器,并以其为参数构建opener对象opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))# 将opener安装为全局urllib.request.install_opener(opener)
多线程爬虫
利用线程来实现
浏览器伪装技术
反爬机制
第二种:可以通过之前使用代理服务器并经常切换代理服务器方式
第三种:利用一些工具,比如selenium+phantomJS,
各字段解析
Headers字段:
Accept-Encoding
表示浏览器支持的压缩编码有哪些gzip,deflate(一种无损数据压缩算法)
Accept-Language
User-Agent
Connection
表示客户端与服务器的连接类型keep-alive表示持久性连接close表示单方面关闭连接,让连接断开
Host
表示请求的服务器网址
Referer
表示来源网址地址
headers = {\"Accept\": \
框架实现
常见框架
Scrapy
在项目中避免被禁止
禁止Cookie
设置下载延时
使用IP池
使用用户代理池
其他方法,比如进行分布式爬取等
主要组件
工作流
Crawley
Portia
newspaper
python-goose
基础知识
名称
网络机器人
网络蜘蛛
网络蚂蚁
作用
请求网站并提取数据的自动化程序
监测和分析,数据采集和整理
优化搜索引擎
私人订制一个搜索引擎
组成
控制节点
爬虫节点
资源库构成
爬虫种类
通用网络爬虫
初始URL集合
URL队列
页面爬行模块
页面分析模块
页面数据库
链接过滤模块
特点
用于大型搜索引擎
爬取海量数据
图示
聚焦网络爬虫
叶页面分析模块
内容评价模块
链接评价模块
按照预定好的主题有选择地进行网页爬取
实现流程
爬行策略
基于内容评价
基于链接评价
基于增强学习
基于语境图
增量式网络爬虫
在更新的时候只更新改变的地方,而未改变的地方则不更新
深层网络爬虫
分类
基于领域知识的表单填写
基于网页结构分析的表单填写
需要想办法自动填写好对应的表单
深度优先爬行
广度优先爬行
大站优先策略
反链策略
实现原理
第一步获取初始化的URL,初始的URL地址可以由用户人为地指定,可以由用户指定的某个或某几个初始爬取网页决定
第三步将新的URL放到URL队列中,第2步中,获取了下一个新的URL地址之后,会将新的URL地址放到URL队列中
第五步满足爬虫系统设置的停止条件,停止爬取
基本流程
第一步发起请求
request组成部分
请求方式
Get
Post
请求URL
请求header
配置信息等
请求体
post请求
formdata形式
第二步获取响应内容
response组成部分
响应状态
响应头
响应体
第三步解析内容
抓取的数据类型
网页文本
图片,视频
其他
解析方式
直接处理
json解析
xpath
beautifulsoup
怎么解决JavaScript渲染的问题
分析ajax请求
返回json的字符串
Selenium/WebDriver
模拟用浏览器加载网页
Splash
类似Selenium
第四步保存数据
文本类型
纯文本
json,xml
关系型数据库
mysql
非关系型数据库
mongodb
key,value形式
网页更新策略
用户体验策略
历史数据策略
类聚分析策略
网页分析算法
基于用户行为
基于网络拓扑
基于网页粒度
基于网页块粒度
基于网站粒度
基于网页内容
身份识别
Robots.txt文件来确定爬取的网页范围
通过HTTP请求中的User Agent字段告知自己的身份信息
爬取技术定向爬取
解决的问题
1.清晰地定义好爬虫的爬取目标,规划好主题
2.建立好爬取网址的过滤筛选规则以及内容的过滤筛选规则
3.建立好URLP排序算法,让爬虫能够明确有限爬取那些网页,以顺序爬取待爬取的网页
主要步骤
1.理清爬取的目的
2.设置网址的规律规则
3.设好内容采集规则
4.规划好采集任务
5.将采集结果进行相应的修正
6.对结果进行进一步处理,完成任务
主要策略
1.通过正则表达式筛选
2.通过XPath表达式筛选
3.通过xslt筛选
0 条评论
回复 删除
下一页