用Python获取网络数据

原作者:骆昊
https://github.com/jackfrued/Python-100-Days
更多内容欢迎查看并订阅专栏’Python从新手到大师’和‘Python爬虫学习’

文章目录

  • 用Python获取网络数据
    • requests库
    • 编写爬虫代码
    • 使用 IP 代理
    • 简单的总结

网络数据采集是 Python 语言非常擅长的领域,上节课我们讲到,实现网络数据采集的程序通常称之为网络爬虫或蜘蛛程序。即便是在大数据时代,数据对于中小企业来说仍然是硬伤和短板,有些数据需要通过开放或付费的数据接口来获得,其他的行业数据和竞对数据则必须要通过网络数据采集的方式来获得。不管使用哪种方式获取网络数据资源,Python 语言都是非常好的选择,因为 Python 的标准库和三方库都对网络数据采集提供了良好的支持。

requests库

要使用 Python 获取网络数据,我们推荐大家使用名为requests 的三方库,这个库我们在之前的课程中其实已经使用过了。按照官方网站的解释,requests是基于 Python 标准库进行了封装,简化了通过 HTTP 或 HTTPS 访问网络资源的操作。上课我们提到过,HTTP 是一个请求响应式的协议,当我们在浏览器中输入正确的 URL(通常也称为网址)并按下 Enter 键时,我们就向网络上的 Web 服务器发送了一个 HTTP 请求,服务器在收到请求后会给我们一个 HTTP 响应。在 Chrome 浏览器中的菜单中打开“开发者工具”切换到“Network”选项卡就能够查看 HTTP 请求和响应到底是什么样子的,如下图所示。

通过requests库,我们可以让 Python 程序向浏览器一样向 Web 服务器发起请求,并接收服务器返回的响应,从响应中我们就可以提取出想要的数据。浏览器呈现给我们的网页是用 HTML 编写的,浏览器相当于是 HTML 的解释器环境,我们看到的网页中的内容都包含在 HTML 的标签中。在获取到 HTML 代码后,就可以从标签的属性或标签体中提取内容。下面例子演示了如何获取网页 HTML 代码,我们通过requests库的get函数,获取了搜狐首页的代码。

import requestsresp = requests.get('https://www.sohu.com/')
if resp.status_code == 200:print(resp.text)

说明:上面代码中的变量resp是一个Response对象(requests库封装的类型),通过该对象的status_code属性可以获取响应状态码,而该对象的text属性可以帮我们获取到页面的 HTML 代码。

由于Response对象的text是一个字符串,所以我们可以利用之前讲过的正则表达式的知识,从页面的 HTML 代码中提取新闻的标题和链接,代码如下所示。

import reimport requestspattern = re.compile(r'<a.*?href="(.*?)".*?title="(.*?)".*?>')
resp = requests.get('https://www.sohu.com/')
if resp.status_code == 200:all_matches = pattern.findall(resp.text)for href, title in all_matches:print(href)print(title)

除了文本内容,我们也可以使用requests库通过 URL 获取二进制资源。下面的例子演示了如何获取百度 Logo 并保存到名为baidu.png的本地文件中。可以在百度的首页上右键点击百度Logo,并通过“复制图片地址”菜单项获取图片的 URL。

import requestsresp = requests.get('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png')
with open('baidu.png', 'wb') as file:file.write(resp.content)

说明Response对象的content属性可以获得服务器响应的二进制数据。

requests库非常好用而且功能上也比较强大和完整,具体的内容我们在使用的过程中为大家一点点剖析。想解锁关于requests库更多的知识,可以阅读它的官方文档。

编写爬虫代码

接下来,我们以“x瓣电影”为例,为大家讲解如何编写爬虫代码。按照上面提供的方法,我们先使用requests获取到网页的HTML代码,然后将整个代码看成一个长字符串,这样我们就可以使用正则表达式的捕获组从字符串提取我们需要的内容。下面的代码演示了如何从x瓣电影获取排前250名的电影的名称。x瓣电影Top250的页面结构和对应代码如下图所示,可以看出,每页共展示了25部电影,如果要获取到 Top250 数据,我们共需要访问10个页面,对应的地址是https://movie.douban.com/top250?start=xxx,这里的xxx如果为0就是第一页,如果xxx的值是100,那么我们可以访问到第五页。为了代码简单易读,我们只获取电影的标题和评分。

import random
import re
import timeimport requestsfor page in range(1, 11):resp = requests.get(url=f'https://movie.douban.com/top250?start={(page - 1) * 25}',# 如果不设置HTTP请求头中的User-Agent,x瓣会检测出不是浏览器而阻止我们的请求。# 通过get函数的headers参数设置User-Agent的值,具体的值可以在浏览器的开发者工具查看到。# 用爬虫访问大部分网站时,将爬虫伪装成来自浏览器的请求都是非常重要的一步。headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'})# 通过正则表达式获取class属性为title且标签体不以&开头的span标签并用捕获组提取标签内容pattern1 = re.compile(r'<span class="title">([^&]*?)</span>')titles = pattern1.findall(resp.text)# 通过正则表达式获取class属性为rating_num的span标签并用捕获组提取标签内容pattern2 = re.compile(r'<span class="rating_num".*?>(.*?)</span>')ranks = pattern2.findall(resp.text)# 使用zip压缩两个列表,循环遍历所有的电影标题和评分for title, rank in zip(titles, ranks):print(title, rank)# 随机休眠1-5秒,避免爬取页面过于频繁time.sleep(random.random() * 4 + 1)

说明:通过分析x瓣网的robots协议,我们发现x瓣网并不拒绝百度爬虫获取它的数据,因此我们也可以将爬虫伪装成百度的爬虫,将get函数的headers参数修改为:headers={'User-Agent': 'BaiduSpider'}

使用 IP 代理

让爬虫程序隐匿自己的身份对编写爬虫程序来说是比较重要的,很多网站对爬虫都比较反感的,因为爬虫会耗费掉它们很多的网络带宽并制造很多无效的流量。要隐匿身份通常需要使用商业 IP 代理(如蘑菇代理、芝麻代理、快代理等),让被爬取的网站无法获取爬虫程序来源的真实 IP 地址,也就无法简单的通过 IP 地址对爬虫程序进行封禁。

下面以蘑菇代理为例,为大家讲解商业 IP 代理的使用方法。首先需要在该网站注册一个账号,注册账号后就可以购买相应的套餐来获得商业 IP 代理。作为商业用途,建议大家购买不限量套餐,这样可以根据实际需要获取足够多的代理 IP 地址;作为学习用途,可以购买包时套餐或根据自己的需求来决定。蘑菇代理提供了两种接入代理的方式,分别是 API 私密代理和 HTTP 隧道代理,前者是通过请求蘑菇代理的 API 接口获取代理服务器地址,后者是直接使用统一的入口(蘑菇代理提供的域名)进行接入。

下面,我们以HTTP隧道代理为例,为大家讲解接入 IP 代理的方式,大家也可以直接参考蘑菇代理官网提供的代码来为爬虫设置代理。

import requestsAPP_KEY = 'Wnp******************************XFx'
PROXY_HOST = 'secondtransfer.moguproxy.com:9001'for page in range(1, 11):resp = requests.get(url=f'https://movie.douban.com/top250?start={(page - 1) * 25}',# 需要在HTTP请求头设置代理的身份认证方式headers={'Proxy-Authorization': f'Basic {APP_KEY}','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36','Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4'},# 设置代理服务器proxies={'http': f'http://{PROXY_HOST}','https': f'https://{PROXY_HOST}'},verify=False)pattern1 = re.compile(r'<span class="title">([^&]*?)</span>')titles = pattern1.findall(resp.text)pattern2 = re.compile(r'<span class="rating_num".*?>(.*?)</span>')ranks = pattern2.findall(resp.text)for title, rank in zip(titles, ranks):print(title, rank)

说明:上面的代码需要修改APP_KEY为自己创建的订单对应的Appkey值,这个值可以在用户中心用户订单中查看到。蘑菇代理提供了免费的 API 代理和 HTTP 隧道代理试用,但是试用的代理接通率不能保证,建议大家还是直接购买一个在自己支付能力范围内的代理服务来体验。

简单的总结

Python 语言能做的事情真的很多,就网络数据采集这一项而言,Python 几乎是一枝独秀的,大量的企业和个人都在使用 Python 从网络上获取自己需要的数据,这可能也是你将来日常工作的一部分。另外,用编写正则表达式的方式从网页中提取内容虽然可行,但是写出一个能够满足需求的正则表达式本身也不是件容易的事情,这一点对于新手来说尤为明显。在下一节课中,我们将会为大家介绍另外两种从页面中提取数据的方法,虽然从性能上来讲,它们可能不如正则表达式,但是却降低了编码的复杂性,相信大家会喜欢上它们的。

【搬运自用】 用Python获取网络数据 -Python100天从新手到大师Day57(GitHub)相关推荐

  1. Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云)

    Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云) 学习目标 获取网络数据Socket API接口 网络爬虫Crawler(制 ...

  2. python获取网络数据失败_0.人脸识别网络不行下载失败

    爬虫 Python基础.数据分析扩展包Numpy.pandas.matplotlib,Python读取MySQL数据,Python爬虫及Scrapy框架,无监督机器学习算法聚类分析等,以及案例:互联网 ...

  3. Python 获取接口数据,解析JSON,写入文件

    Python 获取接口数据,解析JSON,写入文件 用于练手的例子,从国家气象局接口上获取JSON数据,将它写入文件中,并解析JSON: 总的来说,在代码量上,python代码量要比java少很多.而 ...

  4. MapBox离线地图+python获取瓦片数据

    工作中需要使用离线地图. 使用工具:MapBox离线地图+python获取瓦片数据 前端页面: <!DOCTYPE html> <html> <head><m ...

  5. android—获取网络数据

    取网络数据主要靠发交易(或者说请求,接口等),而这些交易由java中的网络通信,HttpURLConnection和HttpClient实现,以下是具体例子. 大家都知道,网络通信,发送请求有两种方式 ...

  6. python自动获取天气_用python获取天气数据,并作定时播报

    原标题:用python获取天气数据,并作定时播报 数据挖掘入门与实战 公众号: datadw 思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早 ...

  7. 安卓 原生okhttp使用get与post获取网络数据

    网址 https://square.github.io/okhttp/ 配置 依赖 在module的build.gradle中: implementation 'com.squareup.okhttp ...

  8. python获取网络时间_python获取网络时间和本地时间

    今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释. python获取网络时间获取网络时间 def getBeijinTime(): ""&qu ...

  9. python 获取股市数据 baostock + 画K线图 mpl_finance

    python 获取股市数据 baostock + 画K线图 mpl_finance 获取股票数据 安装baostock库 baostock库的特性 获取A股K线数据 核心代码如下 完整代码如下 画K线 ...

最新文章

  1. 这是我读过写得最好的【秒杀系统架构】分析与实战!
  2. python【力扣LeetCode算法题库】13- 罗马数字转整数
  3. httpd是mysql_在Centos下安装httpd、php、Mysql并配置(转载)
  4. 2018中国互联网企业100强揭晓!阿里巴巴名列榜首
  5. 【跨平台网络抓包神器のtcpdump】ubuntu下编译tcpdump开源抓包工具
  6. 【转】Yelp是如何实现每天运行数百万个测试的
  7. IDEA配置jdk (SDK)
  8. LeetCode 1061. 按字典序排列最小的等效字符串(并查集)
  9. java 形参 实参_java 形参是父类实参是子类的问题
  10. 将现有MFC应用程序迁移到BCGControlBar VC界面库中
  11. 2011年11月27日学习内容总结
  12. 数值分析书籍以及Intel性能分析工具
  13. java parseexception_java date类parseException问题
  14. 创建AD域之后设置DNS服务访问外网
  15. 在centos7环境下运行.exe文件
  16. Python语音转文字、音频切割、语音识别
  17. python实时读取串口数据_串口的数据采集、以及数据的实时显示
  18. Microsoft Virtual PC 2007 SP1简体中文语言包
  19. 水果店进货渠道及进货技巧,精品水果店进货方法
  20. Easyrecovery教你Excel表格数据恢复

热门文章

  1. 【转载】什么是.NET?什么是.NET Framework?什么是.NET Core?
  2. C++模拟与高精度——生活大爆炸版石头剪刀布
  3. 类似创客贴 开源_创客社区如何与开源保持一致
  4. 程序员只能干到35岁?华为高管:年龄不是问题,关键是能力
  5. QQ三国行脚第三方软件检测机制
  6. 【2019暑假集训】08.01比赛总结
  7. 菜鸟学习网安写的笔记---1
  8. uwb无线通信技术的优势分析
  9. 关于echarts绘制的世界地图中英文对应表(Echarts-4.1.0版本)
  10. Java读取更新.ini文件(三)