通用网络爬虫
它是搜索引擎的重要组成部分,比如百度(Baiduspider)、搜狗( Sogouspider)、360浏览器 (360Spider)、谷歌搜索等等。通用网络爬虫需要遵守 robots 协议(君子协议,不具备法律效力),网站通过此协议告诉搜索引擎哪些页面可以抓取,哪些页面不允许抓取。
聚焦网络爬虫
是面向特定需求的一种网络爬虫程序,在网页抓取的时候会对网页内容进行筛选和处理,尽量保证只抓取与需求相关的网页信息。
聚焦网络爬虫极大地节省了硬件和网络资源,由于保存的页面数量少所以更新速度很快,这也很好地满足一些特定人群对特定领域信息的需求。
增量式网络爬虫
对已下载网页采取增量式更新,它是一种只爬取新产生的或者已经发生变化网页的爬虫程序,能够在一定程度上保证所爬取的页面是最新的页面,可以理解为实时更新。
from urllib import request
urlopen()向URL发请求,返回响应对象
response=urllib.request.urlopen(‘http://www.baidu.com/’)
urlopen() 向网站发起请求并获取响应对象
例子:response = urllib.request.urlopen(url,timeout)
Request() 用于创建请求对象、包装请求头,比如重构 User-Agent,headers:重构请求头
例子:urllib.request.Request(url,headers)
read() html响应对象方法
例子:response.read() # 返回结果为 bytes 数据类型
geturl() 返回响应对象的URL地址
例子:url = response.geturl()
getcode() 返回请求时的 HTTP 响应码
code = response.getcode()
encode() 字符串转换为字节码
string.encode(“utf-8”)
decode() 字节码转换为字符串
bytes.decode(“utf-8”)
urlencode() 实现对 url 地址的编码操作
例子:urllib.parse.urlencode({‘key’:‘value’}) #字典
注意:urllib.parse.quote(string) #字符串
unquote() 实现对 url 地址的解码操作
from urllib import parse
string = '%E7%88%AC%E8%99%AB'
result = parse.unquote(string)
print(result) #爬虫
from urllib import request
from urllib import parse
1、拼接URL地址
url = 'http://www.baidu.com/s?wd={}'
word = input('请输入搜索内容:')
params = parse.quote(word) #编码操作
full_url = url.format(params)
2、向URL发送请求,Request创建请求对象,重构请求头,urlopen发送请求并获取响应,read()响应对象
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
#创建请求对象,重构请求头
req = request.Request(url = full_url, headers = headers)
#向网站发送请求并获取响应对象
res = request.urlopen(req)
#响应对象方法
html = res.read().decode('utf-8')
3、保存本地
filename = word + '.html'
with open(filename,'w',encoding='utf-8') as f:
f.write(html)
import urllib.parse
from urllib import parse
from urllib import request
# 1、拼接URL地址
def get_url(word):
url = 'http://www.baidu.com/s?wd={}'
params =urllib.parse.urlencode({'wd':word})
full_url=url.format(params)
return full_url
# 2、向URL发送请求
def request_url(full_url,filename):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
#创建请求对象,重构请求头
req = request.Request(url = full_url, headers = headers)
#向网站发送请求并获取响应对象
res = request.urlopen(req)
#响应对象方法
html=res.read().decode('utf-8')
# 3、保存本地
with open(filename,'w',encoding='utf-8') as f:
f.write(html)
# 主程序,__name__内置变量,当前模块下才起作用
# if __name__ == '__main__'这条语句只有在__name__所对应的文件下才会满足条件
if __name__ == '__main__':
word = input("请输入搜索内容:")
full_url = get_url(word)
filename = word + '.html'
request_url(full_url,filename)
例:https://tieba.baidu.com/f?kw=python爬虫&pn=450
使用面向对象的编程方法(关于正则表达式的详细介绍在最上面链接有)
## 爬取百度贴吧数据
import urllib.request
from urllib import request, parse
import time
import random
from ua_info import ua_list # 使用自定义的UA池
class TiebaSpider(object):
# 初始化URL
def __init__(self):
# 定义常用变量,URL或计数变量
self.url = 'http://tieba.baidu.com/f?{}'
# 1.请求函数,得到页面
def get_html(self, url):
# 使用随机的UA
headers = {'User-Agent': random.choice(ua_list)}
# Request 创建请求对象,重构请求头
req = urllib.request.Request(url=url, headers=headers)
# urlopen 向网站发送请求并获取响应对象
res = request.urlopen(req)
# read()响应对象方法
# windows会乱码,需要使用gbk解码,并使用ignore忽略不能处理的字节
# linux可直接使用decode('utf-8')解码
html = res.read().decode("gbk", "ignore")
return html
# 2、解析函数,需要用到解析模块,一般使用正则表达式
def parse_html(self):
pass
# 3、保存文件函数
def save_html(self, filename, html):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
# 4、主函数
def run(self):
name = input('输入贴吧名:')
begin = int(input('输入起始页:'))
stop = int(input('输入终止页:'))
for page in range(begin, stop + 1):
pn = (page - 1) * 50
params = {
'kw': name,
'pn': str(pn)
}
# 拼接URL地址
params = parse.urlencode(params)
url = self.url.format(params)
# 发请求
html = self.get_html(url)
# 定义路径
filename = '{}-{}页.html'.format(name, page)
self.save_html(filename, html)
# 每爬取一个页面随机休眠1-2秒钟
time.sleep(random.randint(1, 2))
if __name__ == '__main__':
start = time.time()
# 实例化对象
spider = TiebaSpider()
spider.run()
end = time.time()
print('程序执行时间:%.2f' % (end - start))
还没有结束=.=