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
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
Python闭包执行时值的传递方式实例分析
Jun 04 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
Jan 08 Python
使用Python实现跳帧截取视频帧
May 31 Python
python自定义函数实现最大值的输出方法
Jul 09 Python
用Python配平化学方程式的方法
Jul 20 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
python中time tzset()函数实例用法
Feb 18 Python
Github 使用python对copilot做些简单使用测试
Apr 14 Python
Python绘制散乱的点构成的图的方法
Apr 21 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
php程序员应具有的7种能力小结
2014/11/27 PHP
php建立Ftp连接的方法
2015/03/07 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python选课系统开发程序
2016/09/02 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
python爬虫之遍历单个域名
2019/11/20 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
新品发布会策划方案
2014/06/08 职场文书
安全横幅标语
2014/06/09 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
义诊活动通知
2015/04/24 职场文书
高一语文教学反思
2016/02/16 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
Python连续赋值需要注意的一些问题
2021/06/03 Python