做者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhyahtml
总览
-
Web抓取是一种从网站提取数据的高效方法(取决于网站的规定)python
-
了解如何使用流行的BeautifulSoup库在Python中执行网页抓取web
-
咱们将介绍能够抓取的不一样类型的数据,例如文本和图像正则表达式
介绍
咱们拥有的数据太少,没法创建机器学习模型。咱们须要更多数据!后端
若是这句话听起来很熟悉,那么你并不孤单!但愿得到更多数据来训练咱们的机器学习模型是一个一直困扰人们的问题。咱们没法在数据科学项目中得到能够直接使用的Excel或.csv文件,对吗?api
那么,如何应对数据匮乏的问题呢?浏览器
实现此目的最有效,最简单的方法之一就是经过网页抓取。我我的发现网络抓取是一种很是有用的技术,能够从多个网站收集数据。现在,某些网站还为你可能但愿使用的许多不一样类型的数据提供API,例如Tweets或LinkedIn帖子。网络
可是有时你可能须要从不提供特定API的网站收集数据。这就是web抓取能力派上用场的地方。做为数据科学家,你能够编写一个简单的Python脚本并提取所需的数据。app
所以,在本文中,咱们将学习Web抓取的不一样组件,而后直接研究Python,以了解如何使用流行且高效的BeautifulSoup库执行Web抓取。框架
咱们还为本文建立了一个免费课程:
- 使用Python进行Web爬网简介。这种结构化的格式将帮助你更好地学习。
请注意,网页抓取要遵照许多准则和规则。并不是每一个网站都容许用户抓取内容,所以存在必定的法律限制。在尝试执行此操做以前,请务必确保已阅读网站的网站条款和条件。
目录
-
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的信息。
Selenium
- Selenium是另外一个使浏览器自动化的流行工具。它主要用于行业中的测试,但也很是方便进行网页抓取。看看这篇很棒的文章,以了解更多有关使用Selenium进行Web抓取的工做方式的信息。
Web爬网的组件
这是构成网页抓取的三个主要组成部分的出色说明:
让咱们详细了解这些组件。咱们将经过goibibo网站抓取酒店的详细信息,例如酒店名称和每间客房的价格,以实现此目的:
注意:请始终遵循目标网站的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”选项以获取该特定卡的源代码。你将得到以下内容:
全部卡的类名都相同,咱们能够经过传递标签名称和属性(如<class>标签)来得到这些卡的列表,其名称以下所示:
# 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>标签中提取。这是由于每张卡和房价只有一个 < p > 标签和 < class > 标签和类名:
# extract the hotel name and price per room for card in cards_data: # get the hotel name hotel_name = card.find('p') # get the room price room_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 dictionary card_details = {} # get the hotel name hotel_name = card.find('p') # get the room price room_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'}) # add data to the dictionary card_details['hotel_name'] = hotel_name.text card_details['room_price'] = room_price.text # append the scraped data to the list scraped_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爬虫!让咱们在下面的实时编码窗口中查看操做方法。
在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的网页。你会注意到网页的完整内容不会一口气加载。
咱们须要向下滚动以在网页上加载更多内容。这是网站后端开发人员使用的一种称为“延迟加载”的优化技术。
可是对咱们来讲,问题是,当咱们尝试从该页面抓取数据时,咱们只会获得该页面的有限内容:
一些网站还建立了“加载更多”按钮,而不是无休止的滚动想法。仅当你单击该按钮时,它将加载更多内容。内容有限的问题仍然存在。所以,让咱们看看如何抓取这些网页。
导航到目标URL并打开“检查元素网络”窗口。接下来,点击从新加载按钮,它将为你记录网络,如图像加载,API请求,POST请求等的顺序。
清除当前记录并向下滚动。你会注意到,向下滚动时,该网页正在发送更多数据的请求:
进一步滚动,你将看到网站发出请求的方式。查看如下URL——仅某些参数值正在更改,你能够经过简单的Python代码轻松生成这些URL:
你须要按照相同的步骤来抓取和存储数据,方法是将请求一页一页地发送到每一个页面。
尾注
这是使用功能强大的BeautifulSoup库对Python中的网络抓取进行的简单且对初学者友好的介绍。老实说,当我正在寻找一个新项目或须要一个现有项目的信息时,我发现网络抓取很是有用。
注意:若是你想以更结构化的形式学习本教程,咱们有一个免费课程,咱们将教授网络抓取BeatifulSoup。你能够在此处查看—— 使用Python进行Web爬网简介。
如前所述,还有其余一些库可用于执行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/