网络爬虫分类
- 通用网络爬虫(搜索引擎使用,遵守robopts协议)
robots协议:网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,通用网络爬虫需要遵守robots协议(君子协议)
查看网站的robots协议: https://www.baidu.com/robots.txt - 聚焦网络爬虫:自己写的爬虫程序
爬取数据步骤
- 确定需要爬取的URL地址
- 由请求模块向URL地址发出请求,并得到网站的响应
- 利用解析模块从响应内容中提取所需数据
所需数据,保存
页面中有其他需要继续跟进的URL地址,则继续第2步去发请求,如此循环
爬虫入门:
1.请求模块
注意:
res.geturl() 返回实际地址解释:有些网页可能会进行重定向,从而返回另一个地址
代码举例:
from urllib import request
#获得相应对象
res=request.urlopen(url='http://www.baidu.com/')
#获取网页源代码(默认是字节串,需要转为字符串)
html=res.read().decode()
#获取实际地址
url=res.geturl()
#返回http响应码
code=res.getcode()
print(res)
print('='*30)
print(html)
print('='*30)
print(url)
print('='*30)
print(code)
结果:
<http.client.HTTPResponse object at 0x000001564CDFADC0>
==============================
<!DOCTYPE html><!--STATUS OK-->
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><meta name="description" content="全球领先的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /><link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg">
......
==============================
http://www.baidu.com/
==============================
200
问题:
我们用于通过相关访问的数据:
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36
通过python爬虫访问的数据如下:
headers下面内容
如何改进?
代码举例:
from urllib import request
# 1.定义常用变量
url='http://httpbin.org/get'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
# 2.包装请求
req=request.Request(url=url,headers=headers)
# 3.发请求
res=request.urlopen(req)
# 4.获取响应内容
html=res.read().decode()
print(html)
结果:
{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"X-Amzn-Trace-Id": "Root=1-6117d0cb-6a429a376d4882805141367c"
},
"origin": "222.137.196.191",
"url": "http://httpbin.org/get"
}
总结:
urllib.parse编码
- 作用:给URL地址中查询参数进行编码
- 导入方式
import urllib.parse
from urllib import parse - 示例(url不能直接识别中文,需要编码进行转换)
–编码前:https://www.baidu.com/s?wd=美女
–编码后:https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3
拼接url的三种方式
小练习:
代码演示:
from urllib import request
from urllib import parse
# 1.拼接url地址
word = input('请输入百度搜索关键字:')
params=parse.urlencode({'wd':word})
url='http://www.baidu.com/s?{}'.format(params)#这个url我们需要提前观察它的结构
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
# 2.发请求获取响应内容
req=request.Request(url=url,headers=headers)
res=request.urlopen(req)
html=res.read().decode()
print(html)
# 3.保存到本地文件
filename=word+'.html'
with open(filename,'w',encoding='utf-8') as f:
f.write(html)
总结:
入门实战案例:
静态爬取一般步骤:
代码如下:
class BaiduTiebaSpider:
def __init__(self):
self.ur1 = 'http://tieba.baidu.com/f?kw={}&pn={}'
self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'}
def get_html(self,url):
req=request.Request(url=url,headers=self.headers)
res=request.urlopen(req)
html=res.read().decode()
return html
def parse_html(self):
"""解析提取数据的函数"""
pass
def save_html(self,filename,html):
with open(filename,'w',encoding='utf8') as f:
f.write(html)
def run(self):
name=input('请输入贴吧名:')
start=int(input('请输入起始页:'))
end=int(input('请输入终止页:'))
params=parse.quote(name)
# 1.拼接url地址
for page in range(start,end+1):
pn=(page-1)*50 #根据所选贴吧url规律计算得出
url=self.ur1.format(params,pn)
html=self.get_html(url)
filename='{}_第{}页.html'.format(name,page)
self.save_html(filename,html)
#终端打印提示
print('第%d页抓取成功' % page)
# 控制数据抓取的频率
time.sleep(random.randint(1,3))
test=BaiduTiebaSpider()
test.run()
结果:
请输入贴吧名:赵丽颖
请输入起始页:1
请输入终止页:3
第1页抓取成功
第2页抓取成功
第3页抓取成功
总结:
温馨提示:
相关操作一定要在法律允许的范围内进行!