python urllib爬虫模块使用解析


Posted in Python onSeptember 05, 2019

前言

网络爬虫也称为网络蜘蛛、网络机器人,抓取网络的数据。其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好。一般爬取数据的目的主要是用来做数据分析,或者公司项目做数据测试,公司业务所需数据。

而数据来源可以来自于公司内部数据,第三方平台购买的数据,还可以通过网络爬虫爬取数据。python在网络爬虫方向上有着成熟的请求、解析模块,以及强大的Scrapy网络爬虫框架。

爬虫分类

1、通用网络爬虫:搜索引擎使用,遵守robots协议(君子协议)

robots协议 :网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。https://www.taobao.com/robots.txt

2、聚焦网络爬虫 :自己写的爬虫程序

爬虫爬取数据步骤

  • 确定需要爬取的URL地址
  • 由请求模块向URL地址发出请求,并得到网站的响应
  • 从响应内容中提取所需数据
    • 所需数据,保存
    • 页面中有其他需要继续跟进的URL地址,继续第2步去发请求,如此循环

请求模块

from urllib import request

request.urlopen()

向网站发起请求并获取响应对象

参数:

URL:需要爬取的URL地址

timeout: 设置等待超时时间,指定时间内未得到响应抛出超时异常

响应对象(response)方法

  • string = response.read().decode('utf-8') 获取响应对象内容(网页源代码),返回内容为字节串bytes类型,顺便需要decode转换成string。
  • url = response.geturl() 返回实际数据的URL地址
  • code = response.getcode() 返回HTTP响应码
from urllib import request
url = '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 request
url = '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 parse
url = 'http://www.baidu.com/s?'
query_string = parse.urlencode({'wd':'美女'})
print(query_string)     # wd=%E7%BE%8E%E5%A5%B3
url = url + query_string
# http://www.baidu.com/wd=%E7%BE%8E%E5%A5%B3

URL地址中多个查询参数

from urllib import parse
query_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 request
from urllib import parse

# 定义常用变量
word = input('请输入搜索内容:')
url = 'http://www.baidu.com/s?'
headers = {'User-Agent':'Mozilla/5.0'}

# url编码,拼接完整URL
query_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 parse
parse.quote('美女')    # %E7%BE%8E%E5%A5%B3

urllib.parse.unquote(string)解码

from urllib import parse
result = parse.unquote('%E7%BE%8E%E5%A5%B3')
print(result)    # 美女

百度贴吧网页获取

  • 输入贴吧名称
  • 输入起始页
  • 输入终止页
  • 保存到本地文件:第1页.html、第2页.html ...

实现步骤

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,parse
import time
import random

class 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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 Python
Python中的__slots__示例详解
Jul 06 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
Python配置虚拟环境图文步骤
May 20 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
Python学习开发之图形用户界面详解
Aug 23 Python
详解Python3 pandas.merge用法
Sep 05 #Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 #Python
python爬取Ajax动态加载网页过程解析
Sep 05 #Python
python实现静态服务器
Sep 05 #Python
python编写简单端口扫描器
Sep 04 #Python
python 3.6.7实现端口扫描器
Sep 04 #Python
python用线性回归预测股票价格的实现代码
Sep 04 #Python
You might like
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
写一个移动端惯性滑动&回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
Cocopanda波兰:购买化妆品、护肤品、护发和香水
2020/05/25 全球购物
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
班主任工作年限证明
2014/01/12 职场文书
煤矿机修工岗位职责
2014/02/07 职场文书
关于责任的演讲稿
2014/05/20 职场文书
单位委托书怎么写
2014/09/21 职场文书
2014年小学工作总结
2014/11/26 职场文书
2016新年感言
2015/08/03 职场文书