使用
urllib.request.urlopen()
打开网页
import urllib.request
file=urllib.request.urlopen("http://www.baidu.com")
使用
file.read()
读取所有网页信息或者file.readline()
读取一行
data=file.read()
dataline=file.readline()
也可以使用
file.readlines()
读取,会得到每行内容组成的列表
urllib.request.urlcleanup ()
可以清理缓存file.info()
得到当前环境信息file.getcode()
得到网页状态码file.geturl()
得到当前爬取的网页名称urllib.request.quote()
用于对不标准字符网页编码urllib.request.unquote()
上面的反过程当爬取一些网页的时候,会出现403错误,因为有防止爬取的反爬虫机制。
可以通过设置headers
信息模拟浏览器登录爬取
通过浏览器查看headers
,如下:
Referer: https://blog.csdn.net/weixin_38312031/article/details/80870261
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36
其中,User-Agent
对应的就是模拟浏览器需要的信息
使用build_opener()
修改报头
import urllib.request
url="https://blog.csdn.net/weixin_38312031/article/details/80870261"
headers=("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
data=opener.open(url).readlines()
使用urllib.request.Request()
下的add_header()
实现浏览器模拟
import urllib.request
url="https://blog.csdn.net/weixin_38312031/article/details/80870261"
req=urllib.request.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36")
data=urllib.request.urlopen(req).read()
print(data)
访问一个网页,如果长时间未响应,则认为页面超时,无法打开网页。
设置timeout
import urllib.request
url="https://blog.csdn.net/weixin_38312031/article/details/80870261"
for i in range(1,100):
try:
file=urllib.request.urlopen(url,timeout=1)
data=file.read()
print(len(data))
except Exception as e:
print("异常:"+e)
六种协议:
- GET请求:GET请求在URL中写上要传递的信息,也可以由表单进行传递。如果使用表单进行传递,表单中的信息会转化为URL地址中的数据,通过URL地址传递
- POST请求:可以向服务器提交数据,是主流的比较安全的数据传递方式。
- PUT请求:请求服务器存储一个资源,通常要指定存储的位置
- DELETE请求:请求服务器删除一个资源
- HEAD请求:请求获取对应的HTTP报头信息
- OPTIONS请求:获得当前URL支持的请求类型
https://www.baidu.com/s?tn=90171537_s_hao_pg&isource=infinity&wd=爬虫
可以看到关键字就是wd=
后的东西,所以可以使用https://www.baidu.com/s?tn=90171537_s_hao_pg&isource=infinity&wd=关键字
进行GET请求得到要的数据
import urllib.request
key="hello"
url="https://www.baidu.com/s?tn=90171537_s_hao_pg&isource=infinity&wd="+key
file=urllib.request.urlopen(url)
data=file.read()
比如网页要提交的姓名框对应的name属性值为“name”,密码对应的输入框中name属性值为“password”,这样我们需要构建的数据就要包括这两个字段值
当一直使用一个ip去爬取同一个网站上的网页时,容易被服务器屏蔽,这个时候可以使用代理服务器
登录网页http://www.xicidaili.com/
,可以看到很多的免费代理ip
举例:使用ip地址222.185.23.130,端口6666
def use_proxy(proxy_addr,url):
import urllib.request
proxy=urllib.request.ProxyHandler({"http":proxy_addr})
opener=urllib.request.build_opener(proxy,urrlib.request.HTTPHandler)
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).decode("utf-8")
return data
proxy_addr="222.185.23.130:6666"
data=use_proxy(proxy_addr,"http://www.baidu.com")
在使用urllib.request.HTTPHandler和urllib.request.HTTPSHandler
时,设置参数 redebuglevel=1
即可
这样可以在代码跑的过程中输出对应的log调试日志
主要的两个类:URLError
类和其子类HTTPERROR
举例:
import urllib.request
import urllib.error
try:
urllib.request.urlopen("http://blog.csdn.net")
except urllib.error.URLError as e:
print(e.code)
print(e.reason)
URLError
主要有以下三种情况:
常见状态码和含义:
- 200 OK 正常
- 301 Moved Permanently 永久性重定向到新的URL
- 302 Found 非永久性重定向到新URL
- 304 NOT Modified 请求的资源未更新
- 400 Bad Request 非法请求
- 401 Unauthorized 请求未授权
- 403 Forbidden 禁止访问
- 404 Not Found 未找到相应页面
- 500 Internal Server Error 服务器内部错误
- 501 Not Implemented 服务器不支持实现请求所需要的功能