python urllib爬虫模块使用解析
Python  /  管理员 发布于 7年前   287
前言
网络爬虫也称为网络蜘蛛、网络机器人,抓取网络的数据。其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好。一般爬取数据的目的主要是用来做数据分析,或者公司项目做数据测试,公司业务所需数据。
而数据来源可以来自于公司内部数据,第三方平台购买的数据,还可以通过网络爬虫爬取数据。python在网络爬虫方向上有着成熟的请求、解析模块,以及强大的Scrapy网络爬虫框架。
爬虫分类
1、通用网络爬虫:搜索引擎使用,遵守robots协议(君子协议)
robots协议 :网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。https://www.taobao.com/robots.txt
2、聚焦网络爬虫 :自己写的爬虫程序
爬虫爬取数据步骤
请求模块
from urllib import request
request.urlopen() 向网站发起请求并获取响应对象
参数:
URL:需要爬取的URL地址
timeout: 设置等待超时时间,指定时间内未得到响应抛出超时异常
响应对象(response)方法
from urllib import requesturl = 'http://www.baidu.com/'# 向百度发请求,得到响应对象response = request.urlopen(url)# 返回网页源代码print(response.read().decode('utf-8'))# 返回http响应码print(response.getcode()) # 200# 返回实际数据URL地址print(response.geturl()) # http://www.baidu.com/
urllib.request.Request() 创建请求对象(包装请求,重构User-Agent,使程序更像正常人类请求)
参数
URL:请求的URL地址
headers:添加请求头(爬虫和反爬虫斗争的第一步)
使用流程
1、创建请求对象(重构User-Agent)
req = urllib.request.Request(url=url,headers={'User-Agent':'Mozilla/5.0 xxxx'})
2、请求对象发起请求,获取响应对象(urlopen)
res = urllib.request.urlopen(req)
3、通过相应对象获取响应内容
html = res.read().decode('utf-8')
from urllib import requesturl = 'http://httpbin.org/get'headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'}# 创建请求对象(包装请求)req = request.Request(url=url,headers=headers)# 发请求,获取响应对象res = request.urlopen(req)# 读取内容,返回网页代码html = res.read().decode('utf-8')print(html)
URL地址编码
urllib.parse.urlencode({dict})
URL地址中一个查询参数
查询参数:{'wd' : '美女'}
urlencode编码后:'wd=%e7%be%8e%e5%a5%b3'
from urllib import parseurl = 'http://www.baidu.com/s?'query_string = parse.urlencode({'wd':'美女'})print(query_string) # wd=%E7%BE%8E%E5%A5%B3url = url + query_string# http://www.baidu.com/wd=%E7%BE%8E%E5%A5%B3
URL地址中多个查询参数
from urllib import parsequery_string_dict = {'wd' : '美女', 'pn' : '50'}query_string = parse.urlencode(query_string_dict)url = 'http://www.baidu.com/s?{}'.format(query_string)print(url)# http://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3&pn=50
拼接URL地址的3种方式
1、字符串相加
'https://www.baidu.com/s?' + urlencode({'wd':'美女','pn':'50'})
2、字符串格式化(占位符)
'https://www.baidu.com/s?%s' % urlencode({'wd':'美女','pn':'50'})
3、format()方法
'https://www.baidu.com/s?{}'.format(urlencode({'wd':'美女','pn':'50'}))
示例 在百度中输入要搜索的内容,把响应内容保存到本地文件
from urllib import requestfrom urllib import parse# 定义常用变量word = input('请输入搜索内容:')url = 'http://www.baidu.com/s?'headers = {'User-Agent':'Mozilla/5.0'}# url编码,拼接完整URLquery_string = parse.urlencode({'wd':word})url = url + query_string# 三步走req = request.Request(url=url,headers=headers)res = request.urlopen(req)html = res.read().decode('utf-8')filename = '{}.html'.format(word)with open(filename,'w',encoding='utf-8') as f: f.write(html)
urllib.parse.quote(string)编码
from urllib import parseparse.quote('美女') # %E7%BE%8E%E5%A5%B3
urllib.parse.unquote(string)解码
from urllib import parseresult = parse.unquote('%E7%BE%8E%E5%A5%B3')print(result) # 美女
百度贴吧网页获取
实现步骤
1、找URL规律
1、不同吧
2、不同页
第1页:http://tieba.baidu.com/f?kw=????&pn=0
第2页:http://tieba.baidu.com/f?kw=????&pn=50
第n页:pn=(n-1)*50
2、获取网页内容
3、保存(本地文件、数据库)
from urllib import request,parseimport timeimport randomclass BaiduSpider(object): def __init__(self): self.url = 'http://tieba.baidu.com/f?kw={}&pn={}' self.headers = {'User-Agent':'Mozilla/5.0'} # 获取响应 def get_page(self,url): req = request.Request(url=url,headers=self.headers) res = request.urlopen(req) html = res.read().decode('utf-8') return html # 保存数据 def write_page(self,filename,html): with open(filename,'w') as f: f.write(html) # 主函数 def main(self): name = input('请输入贴吧名:') start = int(input('请输入起始页:')) end = int(input('请输入终止页:')) # 拼接URL地址,发请求 for page in range(start,end+1): pn = (page-1)*50 kw = parse.quote(name) # url编码 url = self.url.format(kw,pn) html = self.get_page(url) # 获取响应,并保存 filename = '{}-第{}页.html'.format(name,page) self.write_page(filename,html) print('第{}页爬取成功'.format(page)) # 提示进度 time.sleep(random.randint(1,3)) # 控制爬取速度if __name__ == '__main__': spider = BaiduSpider() spider.main()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号