十堰的网站建设,公众号开发流程,常熟网站,公司网站彩页怎么做用Python获取网络数据
网络数据采集是 Python 语言非常擅长的领域#xff0c;上节课我们讲到#xff0c;实现网络数据采集的程序通常称之为网络爬虫或蜘蛛程序。即便是在大数据时代#xff0c;数据对于中小企业来说仍然是硬伤和短板#xff0c;有些数据需要通过开放或付费…用Python获取网络数据
网络数据采集是 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(ra.*?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库更多的知识可以阅读它的官方文档。
编写爬虫代码
接下来我们以“豆瓣电影”为例为大家讲解如何编写爬虫代码。按照上面提供的方法我们先使用requests获取到网页的HTML代码然后将整个代码看成一个长字符串这样我们就可以使用正则表达式的捕获组从字符串提取我们需要的内容。下面的代码演示了如何从豆瓣电影获取排前250名的电影的名称。豆瓣电影Top250的页面结构和对应代码如下图所示可以看出每页共展示了25部电影如果要获取到 Top250 数据我们共需要访问10个页面对应的地址是https://movie.douban.com/top250?startxxx这里的xxx如果为0就是第一页如果xxx的值是100那么我们可以访问到第五页。为了代码简单易读我们只获取电影的标题和评分。 import random
import re
import timeimport requestsfor page in range(1, 11):resp requests.get(urlfhttps://movie.douban.com/top250?start{(page - 1) * 25},# 如果不设置HTTP请求头中的User-Agent豆瓣会检测出不是浏览器而阻止我们的请求。# 通过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(rspan classtitle([^]*?)/span)titles pattern1.findall(resp.text)# 通过正则表达式获取class属性为rating_num的span标签并用捕获组提取标签内容pattern2 re.compile(rspan classrating_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)说明通过分析豆瓣网的robots协议我们发现豆瓣网并不拒绝百度爬虫获取它的数据因此我们也可以将爬虫伪装成百度的爬虫将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:9001for page in range(1, 11):resp requests.get(urlfhttps://movie.douban.com/top250?start{(page - 1) * 25},# 需要在HTTP请求头设置代理的身份认证方式headers{Proxy-Authorization: fBasic {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;q0.8,en-US;q0.6,en;q0.4},# 设置代理服务器proxies{http: fhttp://{PROXY_HOST},https: fhttps://{PROXY_HOST}},verifyFalse)pattern1 re.compile(rspan classtitle([^]*?)/span)titles pattern1.findall(resp.text)pattern2 re.compile(rspan classrating_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 从网络上获取自己需要的数据这可能也是你将来日常工作的一部分。另外用编写正则表达式的方式从网页中提取内容虽然可行但是写出一个能够满足需求的正则表达式本身也不是件容易的事情这一点对于新手来说尤为明显。在下一节课中我们将会为大家介绍另外两种从页面中提取数据的方法虽然从性能上来讲它们可能不如正则表达式但是却降低了编码的复杂性相信大家会喜欢上它们的。