得益于Python丰富的包,使用Python的编写爬虫已经是一件非常简单的事情了。事实上,爬虫最困难的并不是如何访问资源,而是如何绕过服务器的反爬虫机制
编写爬虫主要分为三步:
- 访问服务器爬取HTML代码
- 使用正则表达式等工具分析HTML代码或许需要的信息
- 按照自身需求对所分析出的数据进行存贮,分为:文件存储, 数据库存储
访问服务器:
python常用包:urllib;urllib3;request
urllib
urllib属于Python标准库,urllib主要注重于url的构建
进行请求
import urllib
'''
当data is not None时, 默认POST访问
'''
req = urllib.request.Request(url=url, data=data, headers=header, method='GET'or'POST')
respnse = urllib.request.urlopen(req)
使用代理
proxy_handler = ProxyHander({
'http':
'https':
})
opener = build_opener(proxy_handler)
try:
response = opener.open(url=url)
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
拆分和合并URL
result = urllib.parse(url=url)
其中result包括 scheme, netloc, path, params(参数), query(查询), fragment(信息片断)
urllib.parse(url=url, scheme='', allow_fragment=True or False)
urllib.urlunparse(data) 合并URL
urllib.urlsplit(url=url, scheme='', allow_fragment=True or False)
使用urlsplit会把path和params合并在一起作为path
urllib.urlunsplit(data)
URLJOIN
urllib.urljoin(base_url='', url)
base_url 只包含 scheme, netloc, path. 当url不是完整url则将url连接到base_url, 如果url完整, 则返回url
URLENCODE
将字典进行编码
编码与解码
urllib.quote(str) # 对字符串进行编码
urllib.unquote(str)# 解码
PARSE_QS
urllib.parse_qs(str) 将多个参数转化为字典
urllib.parse_qsl(str) 将多个参数转化为列表,列表的元素是一个含有2个元素的元组
urllib3
urllib3更注重HTTP访问
http = PoolManager()
reponse = http.request(method='GET'or'POST', url=url, fields={:}, headers=header, timeout= )
data = reponse.data.decode('utf-8')
获取响应头数据
for key in response.info().keys():
print(response.info()[key])
request
擅长处理cookies
response = request.get(url, params=parsm, headers=header, cookies=cookie, proxies=proxies)
print(response.text)
print(response.content.decode('utf-8'))
response = request.post(url, data=data, headers=header, files=files1)
print(response.text)
print(response.content.decode('utf-8'))
获得cookies
response.cookies
使用Session
session = request.Session()
session.get() 可以与服务器建立会话
构建请求头
# 封装数据
req = Request(method='get'or'post', data=data, headers=header)
# 返回 requests.models.Response 对象
prepare = session.prepare_request(req)
# 发送请求
response = session.send(prepare)
print(response.text)