1. python连接互联网
使用urllib库或者requests库
urllib库是python自带的标准库
requests库是第三方库,友好度更高,需要安装(anaconda实测不用)
urllib.request.urlopen()
# 导包
import urllib.request
# 打开网站,保存内容,赋值到response
response = urllib.request.urlopen("http://www.fishc.com")
# 显示内容,转utf格式
html = response.read()
html = html.decode("utf-8")
print(html)
urlopen默认参数:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
2. 实战:
下载猫图片
存放猫图片的网站: placekitten.com
使用anaconda的jupyter
代码:
import urllib.request
# 打开url,在这个网站,/g/500/600表示一张黑白的500*600的图片
response = urllib.request.urlopen("http://placekitten.com/g/500/600")
# 读取网址,存放到cat_img,注意此时还是二进制
cat_img = response.read()
# 保存为图片文件cat_01.jpg
with open('cat_01.jpg','wb') as f:
f.write(cat_img)
对于打开的网站,除了read方法,还有geturl、info、getcode方法
geturl:获取网址
info:(服务器返回的HTTPmessage信息),使用print打印出来
getcode:网址状态,200正常、404找不到等等
3. 爬虫隐藏:
import urllib.request
# 查看ip的一个网站
# url = 'https://www.whatismyip.com/'
url = 'http://ip.webmasterhome.cn/'
# 创建代理(代理ip是百度的)
proxy_support = urllib.request.ProxyHandler({'http':'124.243.226.18:8888'})
# 创建一个opener
opener = urllib.request.build_opener(proxy_support)
# 修改headers
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0')]
# 安装opener
urllib.request.install_opener(opener)
# 访问
response = urllib.request.urlopen(url)
html = response.read().decode('gb2312')
print(html)
因为代理ip是百度的,免费但不稳定,所以多添加一些ip,及时更换
方法:
# 创建代理
# proxy_support = urllib.request.ProxyHandler({'http':'124.243.226.18:8888'})
ip_list = [# 代理ip列表,及时更换
'124.243.226.18:8888',
'61.135.217.7:80',
'101.132.71.56:808',
'61.135.155.82:443',
'101.132.71.56:808',
'221.227.31.84:8123']
proxy_support = urllib.request.ProxyHandler({'http':'random.choice(ip_list)'})
最终代码在anaconda的jupyter中。
4. 正则表达式
Python3 正则表达式:https://www.runoob.com/python3/python3-reg-expressions.html
基础:
re : 正则表达式包
样式 : r'字符串','字符串'
. : 任意字符
\ : 消除特殊字符的特殊功能如\.,或者附加特殊功能,如\d代表任意数字
[] : 取值范围,如[0-9]、[aeiou]、[a-z]
{} : 重复次数,可以是一个范围,如{3-6}
() : 跟数学运算差不多,组合起来,如([0-9][a-z]){3-6}
特殊字符: 详见 https://www.runoob.com/python3/python3-reg-expressions.html
5. 异常处理
URLerror:url异常,如url错误【Error 11001】
HTTPerror:http异常
http状态码大全:http://www.cnblogs.com/Qi1007/p/10058986.html
遇到的问题:
1) HTTP Error 403: Forbidden
网页拒绝了爬虫的访问,可以尝试加headers,使用代理ip
2) ValueError: too many values to unpack (expected 2)
数据格式错了,这里是headers格式错了,修改后解决
3) urllib.error.URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。>
访问网页不成功,说明代理ip不行,换一个后解决