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多线程、异步+多进程爬虫实现代码
Feb 17 Python
Django 视图层(view)的使用
Nov 09 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 Python
使用python实现ftp的文件读写方法
Jul 02 Python
python过滤中英文标点符号的实例代码
Jul 15 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 Python
python 列表推导式使用详解
Aug 29 Python
python命令 -u参数用法解析
Oct 24 Python
django序列化时使用外键的真实值操作
Jul 15 Python
总结Python连接CS2000的详细步骤
Jun 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判断字符以及字符串的包含方法属性
2008/08/30 PHP
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
js转html实体的方法
2016/09/27 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Python @property及getter setter原理详解
2020/03/31 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
Python如何将装饰器定义为类
2020/07/30 Python
经理秘书岗位职责
2013/11/14 职场文书
文秘专业应届生求职信范文
2013/11/14 职场文书
餐饮主管岗位职责
2013/12/10 职场文书
毕业实习评语
2014/02/10 职场文书
小学数学国培感言
2014/03/10 职场文书
小学感恩节活动总结
2015/03/24 职场文书
中学政教处工作总结
2015/08/13 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android