入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法
作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya
总览
Web抓取是一种从网站提取数据的高效方法(取决于网站的规定)
了解如何使用流行的BeautifulSoup库在Python中执行网页抓取
我们将介绍可以抓取的不同类型的数据,例如文本和图像
介绍
我们拥有的数据太少,无法建立机器学习模型。我们需要更多数据!
如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题。我们无法在数据科学项目中获得可以直接使用的Excel或.csv文件,对吗?
那么,如何应对数据匮乏的问题呢?
实现此目的最有效,最简单的方法之一就是通过网页抓取。我个人发现网络抓取是一种非常有用的技术,可以从多个网站收集数据。如今,某些网站还为你可能希望使用的许多不同类型的数据提供API,例如Tweets或LinkedIn帖子。
但是有时你可能需要从不提供特定API的网站收集数据。这就是web抓取能力派上用场的地方。作为数据科学家,你可以编写一个简单的Python脚本并提取所需的数据。
因此,在本文中,我们将学习Web抓取的不同组件,然后直接研究Python,以了解如何使用流行且高效的BeautifulSoup库执行Web抓取。
我们还为本文创建了一个免费课程:
- 使用Python进行Web爬网简介。这种结构化的格式将帮助你更好地学习。
- https://courses.analyticsvidhya.com/courses/introduction-to-web-scraping
请注意,网页抓取要遵守许多准则和规则。并非每个网站都允许用户抓取内容,因此存在一定的法律限制。在尝试执行此操作之前,请务必确保已阅读网站的网站条款和条件。
目录
3个流行的工具和库,用于Python中的Web爬虫
Web爬网的组件
- Crawl
- Parse and Transform
- Store
从网页中爬取URL和电子邮件ID
爬取图片
在页面加载时抓取数据
3个流行的工具和库,用于Python中的Web爬虫
你将在Python中遇到多个用于Web抓取的库和框架。以下是三种高效完成任务的热门工具:
BeautifulSoup
BeautifulSoup是Python中一个了不起的解析库,可用于从HTML和XML文档进行Web抓取。
BeautifulSoup会自动检测编码并优雅地处理HTML文档,即使带有特殊字符也是如此。我们可以浏览已解析的文档并找到所需的内容,这使得从网页中提取数据变得快捷而轻松。在本文中,我们将详细学习如何使用Beautiful Soup构建web Scraper
Scrapy
- Scrapy是用于大规模Web抓取的Python框架。它为你提供了从网站中高效提取数据,根据需要进行处理并以你喜欢的结构和格式存储数据所需的所有工具。你可以在这里有关Scrapy的信息。
- https://www.analyticsvidhya.com/blog/2017/07/web-scraping-in-python-using-scrapy
Selenium
- Selenium是另一个使浏览器自动化的流行工具。它主要用于行业中的测试,但也非常方便进行网页抓取。看看这篇很棒的文章,以了解更多有关使用Selenium进行Web抓取的工作方式的信息。
- https://www.analyticsvidhya.com/blog/2019/05/scraping-classifying-youtube-video-data-python-selenium
Web爬网的组件
这是构成网页抓取的三个主要组成部分的出色说明:
让我们详细了解这些组件。我们将通过goibibo网站抓取酒店的详细信息,例如酒店名称和每间客房的价格,以实现此目的:
注意:请始终遵循目标网站的robots.txt文件,该文件也称为漫游器排除协议。这可以告诉网络漫游器不要抓取哪些页面。
- https://www.goibibo.com/robots.txt
因此,我们被允许从目标URL中抓取数据。我们很高兴去写我们的网络机器人的脚本。让我们开始!
第1步:Crawl(抓取)
Web抓取的第一步是导航到目标网站并下载网页的源代码。我们将使用请求库来执行此操作。http.client和urlib2是另外两个用于发出请求和下载源代码的库。
- http.client:https://docs.python.org/3/library/http.client.html#module-http.client
- urlib2:https://docs.python.org/2/library/urllib2.html
下载了网页的源代码后,我们需要过滤所需的内容:
"""
Web Scraping - Beautiful Soup
"""# importing required libraries
import requests
from bs4 import BeautifulSoup
import pandas as pd# target URL to scrap
url = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/"# headers
headers = {'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"}# send request to download the data
response = requests.request("GET", url, headers=headers)# parse the downloaded data
data = BeautifulSoup(response.text, 'html.parser')
print(data)
步骤2:Parse and Transform(解析和转换)
Web抓取的下一步是将这些数据解析为HTML解析器,为此,我们将使用BeautifulSoup库。现在,如果你已经注意到我们的目标网页,则与大多数网页一样,特定酒店的详细信息也位于不同的卡片上。
因此,下一步将是从完整的源代码中过滤卡片数据。接下来,我们将选择该卡片,然后单击“Inspect Element”选项以获取该特定卡的源代码。你将获得如下内容:
所有卡的类名都相同,我们可以通过传递标签名称和属性(如标签)来获得这些卡的列表,其名称如下所示:
# find all the sections with specifiedd class name
cards_data = data.find_all('div', attrs={'class', 'width100 fl htlListSeo hotel-tile-srp-container hotel-tile-srp-container-template new-htl-design-tile-main-block'})# total number of cards
print('Total Number of Cards Found : ', len(cards_data))# source code of hotel cards
for card in cards_data:print(card)
我们从网页的完整源代码中过滤出了卡数据,此处的每张卡都包含有关单独酒店的信息。仅选择酒店名称,执行“Inspect Element”步骤,并对房间价格执行相同操作:
现在,对于每张卡,我们必须找到上面的酒店名称,这些名称只能从
标签中提取。这是因为每张卡和房价只有一个 < p > 标签和 < class > 标签和类名:
# extract the hotel name and price per room
for card in cards_data:# get the hotel namehotel_name = card.find('p')# get the room priceroom_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'})print(hotel_name.text, room_price.text)
步骤3:Store(储存数据)
最后一步是将提取的数据存储在CSV文件中。在这里,对于每张卡,我们将提取酒店名称和价格并将其存储在Python字典中。然后,我们最终将其添加到列表中。
接下来,让我们继续将此列表转换为Pandas数据框,因为它允许我们将数据框转换为CSV或JSON文件:
# create a list to store the data
scraped_data = []for card in cards_data:# initialize the dictionarycard_details = {}# get the hotel namehotel_name = card.find('p')# get the room priceroom_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'})# add data to the dictionarycard_details['hotel_name'] = hotel_name.textcard_details['room_price'] = room_price.text# append the scraped data to the listscraped_data.append(card_details)# create a data frame from the list of dictionaries
dataFrame = pd.DataFrame.from_dict(scraped_data)# save the scraped data as CSV file
dataFrame.to_csv('hotels_data.csv', index=False)
恭喜!我们已经成功创建了一个基本的网页抓取工具。我希望你尝试这些步骤,并尝试获取更多数据,例如酒店的等级和地址。现在,让我们看看如何执行一些常见任务,例如在页面加载时抓取URL,电子邮件ID,图像和抓取数据。
从网页中抓取URL和电子邮件ID
我们尝试使用网络抓取功能抓取的两个最常见的功能是网站URL和电子邮件ID。我敢肯定你曾经参与过需要大量提取电子邮件ID的项目或挑战。因此,让我们看看如何在Python中抓取这些内容。
使用Web浏览器的控制台
假设我们要跟踪我们的Instagram关注者,并想知道取消关注我们帐户的人的用户名。首先,登录到你的Instagram帐户,然后单击关注者以查看列表:
一直向下滚动,以便将所有用户名都加载到浏览器内存中的后台
右键单击浏览器窗口,然后单击“检查元素”
在控制台窗口中,键入以下命令:
urls = $$(‘a’); for (url in urls) console.log ( urls[url].href);
仅需一行代码,我们就可以找到该特定页面上存在的所有URL:
接下来,将此列表保存在两个不同的时间戳中,一个简单的Python程序将使你知道两者之间的区别。我们将能够知道取消了我们的帐户的用户名!
我们可以使用多种方法来简化此任务。主要思想是,只需一行代码,我们就可以一次性获得所有URL。
使用Chrome扩展程序电子邮件提取器
电子邮件提取器是一个Chrome插件,可捕获我们当前正在浏览的页面上显示的电子邮件ID
它甚至允许我们下载CSV或文本文件中的电子邮件ID列表:
BeautifulSoup和正则表达式
仅当我们只想从一页抓取数据时,以上解决方案才有效。但是,如果我们希望对多个网页执行相同的步骤怎么办?
有许多网站可以通过收费为我们做到这一点。但这里有个好消息——我们还可以使用Python编写自己的Web爬虫!让我们在下面的实时编码窗口中查看操作方法。
- https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2019/10/web-scraping-hands-on-introduction-python
在Python中爬取图片
在本节中,我们将从同一个Goibibibo网页抓取所有图片。第一步是导航到目标网站并下载源代码。接下来,我们将使用 < img > 标签查找所有图像:
"""
Web Scraping - Scrap Images
"""# importing required libraries
import requests
from bs4 import BeautifulSoup# target URL
url = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/"headers = {'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"}response = requests.request("GET", url, headers=headers)data = BeautifulSoup(response.text, 'html.parser')# find all with the image tag
images = data.find_all('img', src=True)print('Number of Images: ', len(images))for image in images:print(image)
从所有图像标签中,仅选择src部分。另外,请注意,酒店图片以jpg格式提供。因此,我们将仅选择那些:
# select src tag
image_src = [x['src'] for x in images]# select only jp format images
image_src = [x for x in image_src if x.endswith('.jpg')]for image in image_src:print(image)
现在我们有了图像URL的列表,我们要做的就是请求图像内容并将其写入文件中。确保打开文件“ wb”(写二进制文件)形式
image_count = 1
for image in image_src:with open('image_'+str(image_count)+'.jpg', 'wb') as f:res = requests.get(image)f.write(res.content)image_count = image_count+1
你还可以按页码更新初始页面URL,并反复请求它们以收集大量数据。
在页面加载时抓取数据
让我们看一下Steam社区Grant Theft Auto V Reviews的网页。你会注意到网页的完整内容不会一口气加载。
- https://steamcommunity.com/app/271590/reviews/?browsefilter=toprated&snr=1_5_100010_
我们需要向下滚动以在网页上加载更多内容。这是网站后端开发人员使用的一种称为“延迟加载”的优化技术。
但是对我们来说,问题是,当我们尝试从该页面抓取数据时,我们只会得到该页面的有限内容:
一些网站还创建了“加载更多”按钮,而不是无休止的滚动想法。仅当你单击该按钮时,它将加载更多内容。内容有限的问题仍然存在。因此,让我们看看如何抓取这些网页。
导航到目标URL并打开“检查元素网络”窗口。接下来,点击重新加载按钮,它将为你记录网络,如图像加载,API请求,POST请求等的顺序。
清除当前记录并向下滚动。你会注意到,向下滚动时,该网页正在发送更多数据的请求:
进一步滚动,你将看到网站发出请求的方式。查看以下URL——仅某些参数值正在更改,你可以通过简单的Python代码轻松生成这些URL:
你需要按照相同的步骤来抓取和存储数据,方法是将请求一页一页地发送到每个页面。
尾注
这是使用功能强大的BeautifulSoup库对Python中的网络抓取进行的简单且对初学者友好的介绍。老实说,当我正在寻找一个新项目或需要一个现有项目的信息时,我发现网络抓取非常有用。
注意:如果你想以更结构化的形式学习本教程,我们有一个免费课程,我们将教授网络抓取BeatifulSoup。你可以在此处查看—— 使用Python进行Web爬网简介。
- https://courses.analyticsvidhya.com/courses/introduction-to-web-scraping
如前所述,还有其他一些库可用于执行Web抓取。我很想听听你更喜欢的库的想法(即使你使用R语言!),以及你对该主题的经验。在下面的评论部分中告诉我,我们将与你联系!
原文链接:https://www.analyticsvidhya.com/blog/2019/10/web-scraping-hands-on-introduction-python/
欢迎关注磐创AI博客站: http://panchuang.net/
sklearn机器学习中文官方文档: http://sklearn123.com/
欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/
入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法相关推荐
- python爬取所有数据_入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法...
作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya 总览 Web抓取是一种从网站提取数据的高效方法(取决于网站的规定) 了解如何使用流行的BeautifulSoup ...
- 如何用python爬取数据_入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法...
作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya 总览 Web抓取是一种从网站提取数据的高效方法(取决于网站的规定) 了解如何使用流行的BeautifulSoup ...
- python爬百度翻译-Python爬取百度翻译(利用json提取数据)
本篇文章给大家带来的内容是关于Python爬取百度翻译(利用json提取数据),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 工具:Python 3.6.5.PyCharm开发工具. ...
- python程序员爬取分析20万场吃鸡数据,带妹吃鸡,终成人生赢家
首先,神枪镇楼 python程序员爬取分析20万场吃鸡数据,带妹吃鸡,终成人生赢家 吃鸡,撩妹神器 吃鸡游戏受到很多年轻人的喜爱,用户量也非常大.有很多地图,场景逼真,技术玩法,增加了游戏可玩性.而且 ...
- python爬取行业数据_用Python进行Web爬取数据
介绍 我们拥有的数据太少,无法建立机器学习模型.我们需要更多数据! 如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题.我们无法在数据科学项目中获 ...
- Python加密破解爬取七麦数据网APP榜单数据
免责声明 七麦数据(原ASO100)是七麦科技推出的国内专业的移动应用数据分析平台,是国内同时打通App数据.微信公众号数据.小程序数据的数据分析平台. 软件均仅用于学习交流,请勿用于任何商业用途!感 ...
- 【python爬虫】爬取深圳证券业协会公布的营业部数据并对pdf文件进行解析
假装目录有用 背景 抓包 导入第三方库 爬虫代码 pdf解析 完整代码 背景 深圳证券业协会网站公布了辖区内所有证券营业部的股基交易量.净利润.营收数据,免登录就能查看,我们需要获取这部分数据,由于都 ...
- python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...
Python爬虫入门实战--------一周天气预报爬取[转载][没有分析 Python爬虫入门实战--------一周天气预报爬取[转载][没有分析] 来源:https://blog.csdn.ne ...
- python爬取手机app图片_python 手机app数据爬取
今天向大家介绍app爬取. @ 一:爬取主要流程简述 1.APP的爬取比Web爬取更加容易,反爬虫没有那么强,且大部分数据是以JSON形式传输的,解析简单. 2.在APP中想要查看请求与响应(类似浏览 ...
- Python实战,爬取金融期货数据
大家好,我是毕加锁. 今天给大家带来的是 Python实战,爬取金融期货数据 文末送书! 文末送书! 文末送书! 任务简介 首先,客户原需求是获取https://hq.smm.cn/copper网 ...
最新文章
- 数据结构乐智教学百度云_网易云课堂 - 我的职业课堂
- AMAZING AUCTION (第三届省赛)
- ui设计现状与意义_想转行UI设计?你必须要了解以下内容
- SS CMS 全新跨平台 V7.0 版本正式发布
- display:inline display:block
- wp7 --缓动动画
- Java讲课笔记05:运算符与表达式
- casbin-权限管理
- 【8.0、9.0c】树形列表 列标题 不对齐的问题及解决方案
- ggplot2 | 位置调整函数
- 对话 SmartX:领跑超融合中高端市场之道——用专注加专业构筑企业云基础
- 单调栈求全1(或全0)子矩阵的个数 洛谷P5300与或和 P3400仓鼠窝
- Vue(二十三)vuex + axios + 缓存 运用 (以登陆功能为例)
- IOS 使用 ZbarSDK 二维码扫描
- 攻防世界 web高手进阶区 7分题 wtf.sh-150
- 九九乘法表之循环嵌套的奇妙
- 学生信息管理系统(一)——登录窗体
- 博世传感器调试笔记(二)加速度及陀螺仪传感器BMI160
- 苹果手机壳_手机壳推荐:iPhone12手机壳苹果保护壳平价个性推荐
- 操作系统期末知识点浓缩总结复习
热门文章
- 小问题:要把pdg格式的jpg图片还原成pc能显示的jpg图片
- 不能创建对象qmdispatch_关于系统弹出错误:429 , ActiveX 部件不能创建对象 的解决方法...
- LeetCode 372. 超级次方(递归)
- 虚拟主机与云服务器有什么区别,我们应该如何选择
- JDK1.8和JRE文件结构
- 第21期状元简讯:自贸区首个跨境电商平台将上线
- Android手机安装谷歌服务框架
- AutoCAD2012从入门到精通中文视频教程 第20课 移动与旋转(个人收藏)
- 3分钟教你绘制一个围棋棋盘
- Graphene图数据建模工具