站数据采集在网络世界中具有举足轻重的地位,它可助我们高效收集各类互联网信息。身为资深网络新闻从业者,我有机会亲身实践该技术,现将心得与各位共享。
1.确定抓取目标
实施网站抓取前需明晰目标,包括抓取网站、所需信息类型及量级等要素。据我经验,事先精密规划有助于任务流畅执行。
2.选择合适的工具
在网站抓取环节,择优选取合适的工具至关重要。众多优秀的抓取工具如Python内置的BeautifulSoup及Scrapy等任君挑选。结合自身需求与技能层级选择适当的工具,并熟稔其操作要领。
3.分析页面结构
在进行抓取操作前,需要深入剖析目标网站的页面构造。此过程需阅读查阅HTML编码,掌握页面设计布局以及各元素构成。如此,我们方可精准拟定提取规则并提升工作效果。
4.编写抓取代码
在获取特定目标网站页面构造及数据抓取需求后,我将编写兼顾清晰度与完善性的代码模组。此类代码主要包含请求访问页面,解析HTML,以及提取所需要素在内的多项处理步骤。在生成抓取代码时,必须兼顾其效率性与可扩展性的优势,以备将来可能出现的优化或升级需求。
5.处理反爬机制
在网络爬虫过程中,我们频繁遭遇诸多反爬措施,如访问频率封顶和人工验证码测试。为妥善应对此类挑战,我们需掌握各类反爬策略,以及如何编写对应代码进行化解。
6.数据清洗和存储
采集所得数据往往需经过净化处理与保存。在本职工作上,我会运用Python的pandas库对数据进行清理与规整,之后存入数据库或Excel文档以便充分利用与良好管理。
7.定期更新和优化
随网络环境的演变,抓取代码须常加改进以适应页面布局的改变,应对新型反爬策略等挑战。只有具备细致洞察力与持续学习习惯,方能在行业竞争中稳操胜券。
8.遵守法律和道德规范
严谨遵守关于网络探勘的法规与道德,严格尊崇robots.txt文档及网站访问权限规定,以合法合规且符合道义的途径进行网站信息采集,方能维护品牌声誉。
9.学习交流,共同进步
身为资深网络记者,我深明学无止境及互动交流之价值所在。与同业、专家及爱好者携手共进,我们定能桎梏大开,技艺日新月异。因此,我诚恳地呼吁各位踊跃投身各类学术研讨与互动交流会中,共创辉煌。
通过上述九个主题的深入阐述,相信您对网站数据采集已经有了更为增进的领悟。作为一位专注的网络新闻从业者,我将会持续地提升自己的技能与知识,以期能够更好地为广大读者带来宝贵且实用的资讯。期待能与诸位共同进步,共创互联网繁荣时代的美好前景!
者:Kerry Parker
翻译:田晓宁
校对:丁楠雅
本文约2900字,建议阅读10分钟。
本教程以在Fast Track上收集百强公司的数据为例,教你抓取网页信息。
作为一名数据科学家,我在工作中所做的第一件事就是网络数据采集。使用代码从网站收集数据,当时对我来说是一个完全陌生的概念,但它是最合理、最容易获取的数据来源之一。经过几次尝试,网络抓取已经成为我的第二天性,也是我几乎每天使用的技能之一。
在本教程中,我将介绍一个简单的例子,说明如何抓取一个网站,我将从Fast Track上收集2018年百强公司的数据:
Fast Track:http://www.fasttrack.co.uk/
使用网络爬虫将此过程自动化,避免了手工收集数据,节省了时间,还可以让所有数据都放在一个结构化文件中。
用Python实现一个简单的网络爬虫的快速示例,您可以在GitHub上找到本教程中所介绍的完整代码。
GitHub链接:https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py
以下是本文使用Python进行网页抓取的简短教程概述:
准备开始
在开始使用任何Python应用程序之前,要问的第一个问题是:我需要哪些库?
对于web抓取,有一些不同的库需要考虑,包括:
在本例中我们使用Beautiful Soup。你可以使用Python包管理器 pip 安装Beautiful Soup:
pip install BeautifulSoup4
安装好这些库之后,让我们开始吧!
检查网页
要知道在Python代码中需要定位哪些元素,首先需要检查网页。
要从Tech Track Top 100 companies收集数据,可以通过右键单击感兴趣的元素来检查页面,然后选择检查。这将打开HTML代码,我们可以在其中看到每个字段包含在其中的元素。
Tech Track Top 100 companies链接:http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/
右键单击感兴趣的元素并选择“Inspect”,显示html元素。
由于数据存储在一个表中,因此只需几行代码就可以直接获取数据。如果您想练习抓取网站,这是一个很好的例子,也是一个好的开始,但请记住,它并不总是那么简单!
所有100个结果都包含在<tr> 元素的行中,并且这些在一页上都可见。情况并非总是如此,当结果跨越多个页面时,您可能需要更改网页上显示的结果数量,或者遍历所有页面以收集所有信息。
League Table网页上显示了包含100个结果的表。检查页面时,很容易在html中看到一个模式。结果包含在表格中的行中:
<table class="tableSorter">
重复的行<tr> 将通过在Python中使用循环来查找数据并写入文件来保持我们的代码最小化!
附注:可以做的另一项检查是网站上是否发出了HTTP GET请求,该请求可能已经将结果作为结构化响应(如JSON或XML格式)返回。您可以在检查工具的网络选项卡中进行检查,通常在XHR选项卡中进行检查。刷新页面后,它将在加载时显示请求,如果响应包含格式化结构,则使用REST客户端(如Insomnia)返回输出通常更容易。
刷新网页后,页面检查工具的网络选项卡
使用Beautiful Soup解析网页html
现在您已经查看了html的结构并熟悉了将要抓取的内容,是时候开始使用Python了!
第一步是导入将用于网络爬虫的库。我们已经讨论过上面的BeautifulSoup,它有助于我们处理html。我们导入的下一个库是urllib,它连接到网页。最后,我们将输出写入csv,因此我们还需要导入csv 库。作为替代方案,可以在此处使用json库。
# import librariesfrom bs4 import BeautifulSoupimport urllib.requestimport csv
下一步是定义您正在抓取的网址。如上一节所述,此网页在一个页面上显示所有结果,因此此处给出了地址栏中的完整url:
# specify the urlurlpage='http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/'
然后我们建立与网页的连接,我们可以使用BeautifulSoup解析html,将对象存储在变量'soup'中:
# query the website and return the html to the variable 'page'page=urllib.request.urlopen(urlpage)# parse the html using beautiful soup and store in variable 'soup'soup=BeautifulSoup(page, 'html.parser')
我们可以在这个阶段打印soup变量,它应该返回我们请求网页的完整解析的html。
print(soup)
如果存在错误或变量为空,则请求可能不成功。可以使用urllib.error模块在此时实现错误处理。
搜索html元素
由于所有结果都包含在表中,我们可以使用find 方法搜索表的soup对象。然后我们可以使用find_all 方法查找表中的每一行。
如果我们打印行数,我们应该得到101的结果,100行加上标题。
# find results within tabletable=soup.find('table', attrs={'class': 'tableSorter'})results=table.find_all('tr')print('Number of results', len(results))
因此,我们可以对结果进行循环以收集数据。
打印soup对象的前两行,我们可以看到每行的结构是:
<tr><th>Rank</th><th>Company</th><th class="">Location</th><th>Year end</th><th class="" style="text-align:right;">Annual sales rise over 3 years</th><th class="" style="text-align:right;">Latest sales £000s</th><th class="" style="text-align:right;">Staff</th><th class="">Comment</th><!-- <th>FYE</th>--></tr><tr><td>1</td><td><a href="http://www.fasttrack.co.uk/company_profile/wonderbly-3/"><span>Wonderbly</span></a>Personalised children's books</td><td>East London</td><td>Apr-17</td><td style="text-align:right;">294.27%</td><td style="text-align:right;">*25,860</td><td style="text-align:right;">80</td><td>Has sold nearly 3m customisable children’s books in 200 countries</td><!-- <td>Apr-17</td>--></tr>
表格中有8栏:Rank,Company,Location,Year End,Annual Sales Rise,Latest Sales, Staff and Comments,所有这些都是我们可以保存的感兴趣的数据。
网页的所有行的结构都是一致的(对于所有网站来说可能并非总是如此!)。因此,我们可以再次使用find_all 方法将每一列分配给一个变量,那么我们可以通过搜索<td> 元素来写入csv或JSON。
循环遍历元素并保存变量
在Python中,将结果附加到一个列表中是很有用的,然后将数据写到一个文件中。我们应该在循环之前声明列表并设置csv的头文件,如下所示:
# create and write headers to a list rows=[]rows.append(['Rank', 'Company Name', 'Webpage', 'Description', 'Location', 'Year end', 'Annual sales rise over 3 years', 'Sales £000s', 'Staff', 'Comments'])print(rows)
这将打印出我们添加到包含标题的列表的第一行。
你可能会注意到表格中有一些额外的字段Webpage和Description不是列名,但是如果你仔细看看我们打印上面的soup变量时的html,那么第二行不仅仅包含公司名称。我们可以使用一些进一步的提取来获取这些额外信息。
下一步是循环结果,处理数据并附加到可以写入csv的rows。
在循环中查找结果:
# loop over resultsfor result in results: # find all columns per result data=result.find_all('td') # check that columns have data if len(data)==0: continue
由于表中的第一行仅包含标题,因此我们可以跳过此结果,如上所示。它也不包含任何<td>元素,因此在搜索元素时,不会返回任何内容。然后,我们可以通过要求数据的长度为非零来检查是否只处理包含数据的结果。
然后我们可以开始处理数据并保存到变量中。
# write columns to variables rank=data[0].getText() company=data[1].getText() location=data[2].getText() yearend=data[3].getText() salesrise=data[4].getText() sales=data[5].getText() staff=data[6].getText() comments=data[7].getText()
以上只是从每个列获取文本并保存到变量。但是,其中一些数据需要进一步清理以删除不需要的字符或提取更多信息。
数据清理
如果我们打印出变量company,该文本不仅包含公司名称,还包含描述。我们然后打印sales,它包含不需要的字符,如脚注符号,最好删除。
print('Company is', company) # Company is WonderblyPersonalised children's books print('Sales', sales) # Sales *25,860
我们希望将company 分为公司名称和描述,我们可以用几行代码实现。再看一下html,对于这个列,有一个 <span> 元素只包含公司名称。此列中还有一个链接指向网站上的另一个页面,其中包含有关该公司的更多详细信息。我们将在稍后使用它!
<td><a href="http://www.fasttrack.co.uk/company_profile/wonderbly-3/"><span>Wonderbly</span></a>Personalised children's books</td>
要将company 分成两个字段,我们可以使用find方法保存<span>元素,然后使用strip 或replace 从company 变量中删除公司名称,这样它只留下描述。
要从sales中删除不需要的字符,我们可以再次使用strip和replace 方法!
# extract description from the name companyname=data[1].find('span', attrs={'class':'company-name'}).getText() description=company.replace(companyname, '') # remove unwanted characters sales=sales.strip('*').strip('?').replace(',','')
我们要保存的最后一个变量是公司网站。如上所述,第二列包含指向另一个页面的链接,该页面具有每个公司的概述。 每个公司页面都有自己的表格,大部分时间都包含公司网站。
检查公司页面上的url元素
要从每个表中抓取url并将其保存为变量,我们需要使用与上面相同的步骤:
查看一些公司页面,如上面的屏幕截图所示,网址位于表格的最后一行,因此我们可以在最后一行内搜索<a>元素。
# go to link and extract company website url=data[1].find('a').get('href') page=urllib.request.urlopen(url) # parse the html soup=BeautifulSoup(page, 'html.parser') # find the last result in the table and get the link try: tableRow=soup.find('table').find_all('tr')[-1] webpage=tableRow.find('a').get('href') except: webpage=None
也有可能出现公司网站未显示的情况,因此我们可以使用try except条件,以防万一找不到网址。
一旦我们将所有数据保存到变量中,我们可以在循环中将每个结果添加到列表rows。
# write each result to rows rows.append([rank, company, webpage, description, location, yearend, salesrise, sales, staff, comments])print(rows)
然后可以试着在循环外打印变量,在将其写入文件之前检查它是否符合您的预期!
写入输出文件
如果想保存此数据以进行分析,可以用Python从我们列表中非常简单地实现。
# Create csv and write rows to output filewith open('techtrack100.csv','w', newline='') as f_output: csv_output=csv.writer(f_output) csv_output.writerows(rows)
运行Python脚本时,将生成包含100行结果的输出文件,您可以更详细地查看这些结果!
尾语
这是我的第一个教程,如果您有任何问题或意见或者不清楚的地方,请告诉我!
原文标题:
Data Science Skills: Web scraping using python
原文链接:
https://towardsdatascience.com/data-science-skills-web-scraping-using-python-d1a85ef607ed
译者简介
田晓宁,质量管理专家,国际认证精益六西格玛黑带,19年从业经验;软件工程专家,拥有CMMI ATM证书,曾主导公司通过CMMI 5级评估;精通ISO9000和ISO27000体系,长期担任公司质量和信息安全主任审核员,每年审核超过50个项目或部门;拥有PMP证书,担任公司项目管理内训师,具有项目管理和系统开发实战经验。
— 完 —
关注清华-青岛数据科学研究院官方微信公众平台“THU数据派”及姊妹号“数据派THU”获取更多讲座福利及优质内容。
文深入探讨如何运用PHP高效获取网页HTML元素信息。
运用文件读取函数,获取网页数据。
利用PHP脚本的强大功能,网页数据的采集中极为便捷,各类网页元素亦可转化为字符形式线上展现。
2.使用正则表达式匹配目标元素
面对诸多网页需求,巧妙运用正则表达式可以精准且迅速搜寻并提取所需的HTML元素。核心技术在于结合正则表达式与网页数据,以实现精确筛选及获取这些元素的目的。
3.使用DOMDocument类解析网页
借助 DOMDocument 类,PHP 为我们提供了深入分析和处理网页的途径。该类功能强大且易用,尤其以其精准读取 HTML 文档树及其灵活操作的表现,在准确获取所需元素方面具有显著优势。
4.使用Simple HTML DOM库
对于正则表达式和DOMDocument类的初学者而言,可能会遭遇困难。为提升工作效率,可尝试借助于诸如Simple HTML DOM这类第三方工具。该工具能准确挖掘所需HTML元素,大幅缩减项目开发时间。
5.使用XPath查询语言
凭借其卓越性能,XPath在应对XML及HTML文档元素抽取任务中表现非凡,为我们提供了对HTML元素的精准与灵动操纵。
6.使用cURL库发送HTTP请求
借助PHP中cURL库的功能优势,我们能够精确满足各种网络页面内容获取和模拟仿真的需求,从而突出页面关键信息的精度提取。
7.处理JavaScript生成的内容
针对个性化需求,运用JavaScript也可实现网站内容的动态生产。为高效达成此目的,我们能依赖于PHP所提供的两种无头浏览器工具包——Selenium以及PhantomJS。
8.处理AJAX请求返回的数据
为了实现在网页间的数据交互和沟通,尤其是借助AJAX技术模拟网络传输和数据获取过程的各项操作,我们会充分利用PHP中独有的CURL模块和众多第三方厂商开发的高效能库,它们将会成为你处理海量信息的强大后盾。
9.使用API接口获取数据
若目标网站具备API访问许可,那么仅需根据接口文档所指定的请求参数,便可自动获取并拆分JSON或者XML格式的回馈数据,进而达到信息交换的目标。
10.注意事项和其他方法
在获取网页中的HTML元素时,需要注意以下几点:
-确保目标网页存在且可访问;
-遵守目标网站的使用规则和法律法规;
-防止对目标网站造成过大的访问压力;
-根据具体需求选择合适的方法和工具。
运用此策略,能精准提取所需HTML组件,为构建多样化应用及特性提供强大后盾。盼望本文能对您在PHP开发过程中网页元素搜寻有所裨益。
*请认真填写需求信息,我们会在24小时内与您取得联系。