python爬取asphttperror400._python爬⾍1⽹页下载与正则匹
配
⼀、爬⾍的定义
⽹络爬⾍(⼜被称为⽹页蜘蛛,⽹络机器⼈,在FOAF社区中间,更经常的称为⽹页追逐者),是⼀种按照⼀定的规则,⾃动地抓取万维⽹信息的程序或者脚本。另外⼀些不常使⽤的名字还有蚂蚁、⾃动索引、模拟程序或者蠕⾍。
爬⾍的过程:当我们在键盘上输⼊⽹址点击搜索之后,通过⽹络⾸先会经过DNS服务器,分析⽹址的域名,到了真正的服务器。然后我们通过HTTP协议对服务器发出GET或POST请求,若请求成功,我们就得到了我们想看到的⽹页,⼀般都是⽤HTML, CSS, JS等前端技术来构建的,若请求不成功,服务器会返回给我们请求失败的状态码,常见到的503,403等。
⼆、urllib库
在Python的urllib库中doc开头是这样简短描述的:
Error:“Exception classesraised by urllib.”----就是由urlli出的exception类
Parse:“Parse (absolute andrelative) URLs.”----解析绝对和相对的URLs
Request:“An extensiblelibrary for opening URLs using a variety of protocols”
----⽤各种协议打开URLs的⼀个扩展库
Response:“Response classesused by urllib.”----被urllib使⽤的response类
1、request请求
urlopen⽅法爬取⽹页
Request⽅法构建headers模拟浏览器操作
quest
headers={'User_Agent':''}
quest.Request('/',headers=headers)
quest.urlopen(response)
ad().decode('utf-8')
print(result)
2、error异常
quest
try:
headers={'User_Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'}
quest.Request('/',headers=headers)
quest.urlopen(response)
ad().decode('utf-8')
URLError as e:
#hasattr() 函数⽤于判断对象是否包含对应的属性。
if hasattr(e,'reason'):
print('错误原因是'+ason))
HTTPError as e:
if hasattr(e,'code'):
print('错误状态码是'+de))
else:
print('请求成功通过')
3、post请求
提交⽤户信息给服务器,如果仅考虑⽤户和密码,查看⽤户名和密码标签的属性name是什么?
通过F12查看浏览器elements中的标签,慢慢。
通过fiddle爬包⼯具
quest
import urllib.parse
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng, */*;q=0.8',
error parse new'Accept-Language': 'zh-CN,zh;q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/48.02564.48 Safari/537.36'
}
# POST请求的信息,填写你的⽤户名和密码
value = {'source': 'index_nav',
'form_password': 'your password',
'form_email': 'your username'
}
try:
data = urllib.parse.urlencode(value).encode('utf8')
response = quest.Request('www.douban/login', data=data, headers=headers)
html = quest.urlopen(response)
result = ad().decode('utf8')
print(result)
URLError as e:
if hasattr(e, 'reason'):
print('错误原因是' + ason))
HTTPError as e:
if hasattr(e, 'code'):
print('错误编码是' + de))
else:
print('请求成功通过。')
注意:复制header的时候请去掉 这⼀项'Accept-Encoding':' gzip, deflate, 否则会提⽰decode的错误。
data = urllib.parse.urlencode(value).encode('utf8')
利⽤urllib库的parse对post内容进⾏解析,对post内容进⾏⼀定的编码格式处理后发送,编码的规则遵从RFC(Request For Comments)标准。
parse.urlencode:将⼀个字典或者有顺序的⼆元素元祖转换为URL的查询字符串。然后再将转换好的
字符串按UTF-8的编码转换为⼆进制格式使⽤
byte—>string—>byte的模式,其中byte—>string为解码,string—>byte为编码
Python3.x中编码解码规则为byte—>string—>byte的模式,其中byte—>string为解码,string—>byte为编码
4、代理IP
各种反爬机制会检测同⼀IP爬取⽹页的频率速度,使⽤代理IP取代我们⾃⼰的IP,不断更换新的IP地址达到快速爬取⽹页⽽降低被检测为机器⼈的⽬的。
同样利⽤request完成代理IP的使⽤,因为特殊功能的需要,这次需要定义、创建特殊的opener。(urlopen是opener的通⽤版本)
request⾥⾯处理各种功能的处理器⽅法:
ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor, DataHandler
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng, */*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/48.02564.48 Safari/537.36' }
# POST请求的信息,填写你的⽤户名和密码
value = {'source': 'index_nav',
'form_password': 'your password',
'form_email': 'your username'
}
#代理IP信息为字典格式,如果是http协议,key为**'http'**,value为**'代理ip:端⼝号'的格式**
proxy={'htttp':'115.193.101..21:61234'}
try:
data = urllib.parse.urlencode(value).encode('utf8')
response = quest.Request('www.douban/login', data=data, headers=headers)
#使⽤ProxyHandler⽅法⽣成处理器对象
proxy_quest.ProxyHandler(proxy)
#创建代理IP的opener实例,参数为proxy的处理器对象
quest.build_opener(proxy_handler)
#⽤代理IP的opener打开指定状态的url信息,将设置的post信息和headers的response作为参数
html = opener.open(response)
result = ad().decode('utf8')
print(result)
URLError as e:
if hasattr(e, 'reason'):
print('错误原因是' + ason))
HTTPError as e:
if hasattr(e, 'code'):
print('错误编码是' + de))
else:
print('请求成功通过。')
免费的代理IP⽹站:
www.xicidaili/
www.66ip/
www.mimiip/gngao/
快代理 - ⾼速http代理ip每天更新
5、超时
防⽌爬取⽹站时,等待时间过长⽽导致效率的降低,有效的超时设置可以强制结束等待进⾏下⼀次的爬取。
通过socket设置超时时间和timeout错误异常,timeout错误属于OSerror的⼦类,时间超出指定timeout就会提⽰socket超时。
import socket
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng, */*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/48.02564.48 Safari/537.36'
}
# POST请求的信息,填写你的⽤户名和密码
value = {'source': 'index_nav',
'form_password': 'your password',
'form_email': 'your username'
}
#代理IP信息为字典格式,key为'http',value为'代理ip:端⼝号'
proxy={'htttp':'115.193.101..21:61234'}
#设置超时为2秒,单位为秒
timeout=2
try:
#设置socket超时
socket.setdefaulttimeout(timeout)
data = urllib.parse.urlencode(value).encode('utf8')
response = quest.Request('www.douban/login', data=data, headers=headers)
#使⽤ProxyHandler⽅法⽣成处理器对象
proxy_quest.ProxyHandler(proxy)
#创建代理IP的opener实例
quest.build_opener(proxy_handler)
#将设置的post信息和headers的response作为参数
html = opener.open(response)
result = ad().decode('utf8')
print(result)
URLError as e:
if hasattr(e, 'reason'):
print('错误原因是' + ason))
HTTPError as e:
if hasattr(e, 'code'):
print('错误编码是' + de))
except socket.timeout:
print('socket超时')
else:
print('请求成功通过。')
6、urllib库parse解析
#urlparse:把URL解析成6个部分
<scheme>://<netloc>/<path>;<params>?<query> #<fragment>#urlsplit:把URL解析成5个部分
<scheme>://<netloc>/<path>?<query> #<fragment># urlunsplit,urlunparse:进⾏URL的重组# 还有urljoin,urldefrag 等。
⽹页解析数据
爬⾍的html/xml解析(现在⽹页⼤部分都是html),可使⽤的⽅法实在有很多种,如:
正则表达式
BeautifulSoup
Lxml
PyQuery
CSSselector
正则表达式(Regular Expression)
它作为⼀种字符串的匹配模式,⽤于查看指定字符串是否存在于被查字符串中,替换指定字符串,或是通过匹配模式查指定字符串。其主要的匹配过程是:
先⽤正则语法定义⼀个规则(pattern)
然后⽤这个规则与你download的⽹页字符串进⾏对⽐,根据pattern提取你想要的数据。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论