python爬取行业数据_用Python进行Web爬取数据

介绍

我们拥有的数据太少,无法建立机器学习模型。我们需要更多数据!

如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题。我们无法在数据科学项目中获得可以直接使用的Excel或.csv文件,对吗?

那么,如何应对数据匮乏的问题呢?

实现此目的最有效,最简单的方法之一就是通过网页抓取。我个人发现网络抓取是一种非常有用的技术,可以从多个网站收集数据。如今,某些网站还为你可能希望使用的许多不同类型的数据提供API,例如Tweets或LinkedIn帖子。

但是有时你可能需要从不提供特定API的网站收集数据。这就是web抓取能力派上用场的地方。作为数据科学家,你可以编写一个简单的Python脚本并提取所需的数据。

因此,在本文中,我们将学习Web抓取的不同组件,然后直接研究Python,以了解如何使用流行且高效的BeautifulSoup库执行Web抓取。

请注意,网页抓取要遵守许多准则和规则。并非每个网站都允许用户抓取内容,因此存在一定的法律限制。在尝试执行此操作之前,请务必确保已阅读网站的网站条款和条件。

目录3个流行的工具和库,用于Python中的Web爬虫Web爬网的组件 Crawl Parse and Transform Store从网页中爬取URL和电子邮件ID爬取图片在页面加载时抓取数据

3个流行的工具和库,用于Python中的Web爬虫

你将在Python中遇到多个用于Web抓取的库和框架。以下是三种高效完成任务的热门工具:

BeautifulSoupBeautifulSoup是Python中一个了不起的解析库,可用于从HTML和XML文档进行Web抓取。BeautifulSoup会自动检测编码并优雅地处理HTML文档,即使带有特殊字符也是如此。我们可以浏览已解析的文档并找到所需的内容,这使得从网页中提取数据变得快捷而轻松。在本文中,我们将详细学习如何使用Beautiful Soup构建web Scraper

ScrapyScrapy是用于大规模Web抓取的Python框架。它为你提供了从网站中高效提取数据,根据需要进行处理并以你喜欢的结构和格式存储数据所需的所有工具。你可以在这里有关Scrapy的信息。 https://www.analyticsvidhya.com/blog/2017/07/web-scraping-in-python-using-scrapy

SeleniumSelenium是另一个使浏览器自动化的流行工具。它主要用于行业中的测试,但也非常方便进行网页抓取。看看这篇很棒的文章,以了解更多有关使用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.clienturlib2:https://docs.python.org/2/library/urllib2.html

下载了网页的源代码后,我们需要过滤所需的内容:

"""Web Scraping - Beautiful Soup"""# importing required librariesimport requestsfrom bs4 import BeautifulSoupimport pandas as pd# target URL to scrapurl = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/"# headersheaders = { "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 dataresponse = requests.request("GET", url, headers=headers)# parse the downloaded datadata = BeautifulSoup(response.text, "html.parser")print(data)

步骤2:Parse and Transform(解析和转换)

Web抓取的下一步是将这些数据解析为HTML解析器,为此,我们将使用BeautifulSoup库。现在,如果你已经注意到我们的目标网页,则与大多数网页一样,特定酒店的详细信息也位于不同的卡片上。

因此,下一步将是从完整的源代码中过滤卡片数据。接下来,我们将选择该卡片,然后单击“Inspect Element”选项以获取该特定卡的源代码。你将获得如下内容:

所有卡的类名都相同,我们可以通过传递标签名称和属性(如标签)来获得这些卡的列表,其名称如下所示:# find all the sections with specifiedd class namecards_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 cardsprint("Total Number of Cards Found : ", len(cards_data))# source code of hotel cardsfor card in cards_data: print(card)

我们从网页的完整源代码中过滤出了卡数据,此处的每张卡都包含有关单独酒店的信息。仅选择酒店名称,执行“Inspect Element”步骤,并对房间价格执行相同操作:

现在,对于每张卡,我们必须找到上面的酒店名称,这些名称只能从

标签中提取。这是因为每张卡和房价只有一个 < p > 标签和 < class > 标签和类名:

# extract the hotel name and price per roomfor 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 datascraped_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 dictionariesdataFrame = pd.DataFrame.from_dict(scraped_data)# save the scraped data as CSV filedataFrame.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 librariesimport requestsfrom bs4 import BeautifulSoup# target URLurl = "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 tagimages = data.find_all("img", src=True)print("Number of Images: ", len(images))for image in images: print(image)

从所有图像标签中,仅选择src部分。另外,请注意,酒店图片以jpg格式提供。因此,我们将仅选择那些:

# select src tagimage_src = [x["src"] for x in images]# select only jp format imagesimage_src = [x for x in image_src if x.endswith(".jpg")]for image in image_src: print(image)

现在我们有了图像URL的列表,我们要做的就是请求图像内容并将其写入文件中。确保打开文件“ wb”(写二进制文件)形式image_count = 1for 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语言!),以及你对该主题的经验。在下面的评论部分中告诉我,我们将与你联系!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gradle compile mysql_Gradle配置implementation、api与compile的区别

自Gradle 3.4开始&#xff0c;compile被废弃&#xff0c;取而代之的是implementation和api两个配置项。掌握这三者的区别实际上就是要清楚什么情况使用implementation替换compile&#xff0c;什么情况下使用api替换compile。implementation替换compile使用implementation配置依…

python偶数列表_使用条件偶数列表创建带有地图的元组 - python

这是我的代码:evenorodd[1,2,3]list1[a,b,c]list2[A,B,C]res tuple(map(lambda x: True if x % 2 ! 0 else False, evenorodd))print(res)输出:(False, True, False, True)我想要这个:如果x&#xff05;2! 0则为list1的元素(如果evenorodd的元素为奇数)list2 else的元素(如果e…

java 获取子线程_Java 主线程获取子线程返回结果

1.自定义package com.jgyang.com;public class MySyncThreadTest {public static void main(String[] args) throws Exception {CustomRunnable cRunnacle new CustomRunnable();Thread thread new Thread(cRunnacle,"子线程");thread.start(); //子线程执行System…

winpythonhadoop_让python在hadoop上跑起来

本文实例讲解的是一般的hadoop入门程序“WordCount”&#xff0c;就是首先写一个map程序用来将输入的字符串分割成单个的单词&#xff0c;然后reduce这些单个的单词&#xff0c;相同的单词就对其进行计数&#xff0c;不同的单词分别输出&#xff0c;结果输出每一个单词出现的频…

java解析html jsoup_2020-06-02 jsoup java解析html

AJsoupAJsoup 模块是快速将html 转换成bean 类似gson转换使用前提你了解jsoup并且了解jsoup的SelectGradlecompile com.github.zdongcoding:ajsoup:0.1.0Mavencom.github.zdongcodingajsoup0.1.0pom使用方法如下&#xff1a;bean.javaSelect(select "body")public c…

串口工具securecrt_SecureCRT配置华为交换机部分命令

点上方蓝字“工控先生”免费快速关注本文由“135编辑由于工作需要&#xff0c;昨天临时需要从华为的光电交换机上面的console口查看一些端口的状态等&#xff0c;现整理如下&#xff0c;有需要的可以参考一下&#xff1a;硬件准备串口线&#xff0c;华为交换机连接将RJ45连接到…

java byte 二维数组_[编程入门]二维数组的转置-题解(Java代码)

解题思路:注意事项:参考代码:import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int[][] a new int[3][3];for(byte i 0; i for(byte j 0;j a[i][j] scanner.nextInt();}}for(byte i 1; i i…

如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)

本文主要向大家介绍了生产环境部署Python语言代码(djangouwsginginx)&#xff0c;通过具体的内容向大家展示&#xff0c;希望对大家学习Python语言有所帮助。基础环境不做介绍&#xff0c;在django开发web项目完成后&#xff0c;一直使用django自带的服务器进行调试&#xff1a…

天天向上续python3.3_Linux 配置系列 四 python3

一、环境准备JDK版本&#xff1a; jdk1.8&#xff1b; 操作系统&#xff1a; centos 7.6 &#xff1b;Python&#xff1a;&#xff1a;3.7.7&#xff1b; tomcat&#xff1a; apache-tomcat-8.5.5;二、配置python32.1 python3依赖包yum install gcc patch libffi-devel python-…

micropython用什么编译_micropython开发者指南

Authorshaniadolphin获取git工程mkdir micropythoncd micropythongit clone https://github.com/micropython/micropython.gitgit submodule update --init运行的结果如下&#xff1a;dolphinDESKTOP-DR5OKOG:/mnt/h/proj/micropython$ cd micropython/dolphinDESKTOP-DR5OKOG:…

java 跳转虚拟目录_java tomcat虚拟目录的深入了解

我们知道&#xff0c;Web网站中的内容(包括网页&#xff0c;图片&#xff0c;音频文件等)一般都存放在App的目录下。但随着网站内容的不断丰富&#xff0c;用户需要把不同层次的内容组织成网站的子目录。我们通常的做法是在网站主目录下新建子目录&#xff0c;并把相关的内容放…

redis工具类_SpringBoot 操作 Redis 数据

SpringBoot 操作 Redis 数据简介 Redis 是一个开源的NoSQL数据库&#xff0c;基于内存的键值存储&#xff0c;速度快。Redis 支持数据结构&#xff0c;如字符串&#xff0c;散列&#xff0c;列表&#xff0c;集和带范围查询的有序集。5种主要数据类型&#xff1a;字符串类型 …

java判断日期是否是同一周_JAVA里面怎样判断一个日期是否是星期六或者星期天,给出原代码,多谢!!!!!!!!!!...

分数全部奉上。|void test2(){String tmp "2001-09-02";SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");try {Date myDate sdf.parse(tmp);Calendar myCalendar Calendar.getInstance();myCalendar.setTime(myDate);int i myCalendar.get(…

python中继承是什么意思_Python面向对象中的继承是什么意思

Python面向对象中的继承是什么意思发布时间&#xff1a;2020-11-09 14:05:42

python ansible模块_ansible常用模块

一、ansible常用模块模块是Ansible执行的最小单位&#xff0c;可以是由Python编写&#xff0c;也可以是Shell编写&#xff0c;也可以是由其他语言编写。一、ping模块测试连接可通性&#xff0c;没有参数。通的话返回pong。1、使用示例ansible all -m ping1、可通&#xff0c;返…

java断点续传 框架_java实现断点续传

用java的URL实现了一个简单的断点续传的列子&#xff0c;不为别的&#xff0c;假如你对断点续传不了解一看就明白了呵呵&#xff0c;算不上高深啊package test;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.Ra…

python大文件排序_Python实现大文件排序的方法

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存储NAS是一个可共享访问&#xf…

python入门到实践试题及答案_python编程:入门到实践练习答案

【实例简介】书本《python编程&#xff1a;入门到实践》的课后练习答案【实例截图】【核心代码】练习答案├── Solutions - Chapter 10.docx├── Solutions - Chapter 11.docx├── Solutions - Chapter 15.docx├── Solutions - Chapter 16.docx├── Solutions - Cha…

java年份换算_java中日期的换算处理

JAVA8中的日期API是JSR-310的实现&#xff0c;并且是工作在ISO-8601日历系统基础上的&#xff0c;但我们也可以在非ISO的日历上。JDK8的日期API大致分为以下几个包&#xff1a;1 java.time包&#xff1a;JDK8中的基础包&#xff0c;所有常用的基础类都是这个包的一部分&#xf…

python地理空间_Python批量下载地理空间数据云数据!Python无所不能!-站长资讯中心...

模拟登录这里要用到两个包&#xff1a;requests和json。requests使用前得先安装&#xff1a;pip install requests。In [3]:进群&#xff1a;548377875 即可获取数十套PDF哦&#xff01;import requestsimport json打开地理空间数据云的登录页面。按F12进入开发者工具台&…