初学爬虫,将一些基本的爬虫方法记录在这里供自己复习,日后会陆续更新。
一些基础知识:
状态码:例如200 400 403 404
HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。 --百度百科
- urlib库里面的request
a.获取网页的代码。 请求方式有GET和POST两种。urlopen方法可以获取网页的代码
from urllib import request
x1=request.urlopen('http://www.baidu.com',data=None)##获取百度首页代码,请求方式为GET
x1.read()##打印全部 read(size)
x1.readline()##读取1行
print(x1.readlines())##读取所有行并以列表形式存储
b.保存网页代码或文件至本地
urlretrieve()函数里第一个参数是url,第二个参数则是保存至本地的路径。
request.urlretrieve('http://www.baidu.com','baidu.html')##将网上文件保存至本地
- url库里面的parse
a.在爬虫的过程种经常会遇到编码方面的问题,而parse里面提供了编码解码的功能。
from urllib import parse
data={'name':'张三','age':10,'st':'asdf'}
p1=parse.urlencode(data)##对data进行编码
p2=parse.parse_qs(p1)##解码
print(p1)
print(p2)
输出:
name=%E5%BC%A0%E4%B8%89&age=10&st=asdf
{'name': ['张三'], 'age': ['10'], 'st': ['asdf']}
b.
urlparse函数可以urlparse函数和urlsplit函数对获取的url进行分割。
两个函数用法十分相似。区别在于urlparse返回的数值中有"params"而urlsplit则不返回。
x=parse.urlparse('https://baike.baidu.com/item/Python/407313?fr=aladdin#2')##对Url各个组成成分的分割
x1=parse.urlsplit('https://baike.baidu.com/item/Python/407313?fr=aladdin#2')
print("scheme:",x.scheme)
print(x1)
输出:
scheme: https
SplitResult(scheme='https', netloc='baike.baidu.com', path='/item/Python/407313', query='fr=aladdin', fragment='2')
- request.Request类
请求头可以帮助我们”伪装“得更像是正常的浏览器去访问,降低爬虫行为被发现的可能性。
如果想要在请求的时候添加请求头,则必须使用request.Request类来实现。
以百度为例:
其中请求头headers1是在网页上获取的
from urllib import request
headers1={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36 Edg/81.0.416.64'
}
res=request.Request('https://www.baidu.com/',headers=headers1)
resp=request.urlopen(res)
print(resp.read())
- ProxyHandler 使用代理ip
原理:先向代理ip服务器发送请求,代理ip再向url发送请求,成功后返回给代理ip然后再返回给本地。
步骤:先传入一个代理,代理是字典的形式,key是http或https,value是ip:port。然后创建一个opener,这样之后就能使用open函数以代理的ip向url发送请求。
from urllib import request
url='https://httpbin.org/ip'##能返回访问ip的神奇网站
handler=request.ProxyHandler({'http':'60.216.101.46:32868'})##传入字典,Key为http或https,value格式:'代理ip:port端口'
opener=request.build_opener(handler)##创建opener
req=request.Request(url)
resp=opener.open(req)##用opener发送一个请求
print(resp.read())