什么是网页抓取?
Web抓取包括收集网站上可用的数据。这可以由人类手动或通过机器人来完成。这是一个从网站提取信息和数据,并将获得的信息转换为结构化数据以进行进一步分析的过程。网络抓取也称为网络收集或网络数据提取。
需要网络抓取
网络抓取有助于获取数据以用于分析趋势,性能和价格监控。它可用于对消费者进行情感分析,以获取新闻文章洞察,市场数据汇总,还用于预测分析和许多自然语言处理项目。网络抓取中使用了各种python库,其中包括:
- Pattern
- Scrapy
- Beautiful soup
- Requests, Merchandize ,Selenium etc.
Scrapy是一个用python编写的完整的webscraping框架,负责下载HTML进行解析。然而,美丽的汤是一个用于从HTML解析和提取数据的库。
网络抓取涉及的步骤
- 文档加载/下载:加载整个HTML页面
- 解析和提取:解释文档并从文档中收集信息
- 转换:转换收集的数据。
对于下载,使用python请求库下载html页面。Scrapy有其内置的请求方法。
尽管解析文档时,有必要熟悉超文本标记语言(HTML)。HTML是用于创建网页的标准标记语言。它由一系列元素/标记名组成,可告诉浏览器如何显示内容。HTML元素由
<start tag>Content here</end tag>
HTML可以表示为包含标签名称/节点的树状结构,其中节点之间存在关系,包括父,子,兄弟姐妹等
下载后,使用CSS选择器或XPATH定位器从HTML源中提取数据
XPath被定义为XML路径。它是使用XML路径表达式在网页上查找任何元素的语法或语言。XPath用于使用HTML DOM结构查找网页上任何元素的位置。
XPATH定位器入门
绝对Xpath:它包含从根元素到所需元素的完整路径。
相对Xpath:这更像是简单地从引用所需元素开始并从特定位置开始。您始终使用相对路径来测试元素
带有说明的XPATH示例
我创建了该HTML脚本来进行练习,复制并另存为(.html)与描述一起使用
<html>
<head><title>Store</title></head>
<body>
<musicshop id="music"><p><h2>MUSIC</p></h2>
<genre><h3><p>Hip-Hop</p></h3>
<ul>
<li>Travis Scott</li>
<li>Pop Smoke</li>
</ul>
</genre>
<genre country="korea"><h3><p>K-pop</p></h3>
<ul>
<li>G Dragon</li>
<li>Super Junior</li>
</ul>
</genre>
</musicshop>
<bookstore id='book'><p><h2>BOOKS</p></h2>
<bookgenre class = "fiction"><p><h3>Fiction</h2></p>
<ul>
<li><booktitle><h5><p>The Beetle</p></h5></booktitle></li>
<li><booktitle><h5><p>The Bell Jar</p></h5></booktitle></li>
<li><booktitle><h5><p>The Book Thief</p></h5></booktitle></bookgenre></li>
</ul>
<bookgenre class="horror"><p><h2>Horror</h2></p>
<ul>
<li><booktitle><h5><p><a href='www.goodreads.com/book/show/3999177-the-bad-seed'>The Bad Seed</a></p></h5></booktitle></li>
<li><booktitle><h5><p>House of Leaves</p></h5></booktitle></li>
<li><booktitle><h5><p>The Hanting of Hill House</p></h5></booktitle></bookgenre></li>
</ul>
</bookstore>
</body>
</html>
复制
创建的HTML在下面的图片中生成网页
在浏览器(Chrome)链接上练习XPATH和CSS定位器
- 按F12打开Chrome DevTools。
- 默认情况下应打开“元素”面板。
- 按Ctrl + F启用面板中的DOM搜索。
- 输入XPath或CSS选择器进行评估。
- 如果存在匹配的元素,它们将在DOM中突出显示。
字符:
- 节点名-选择具有给定名称的节点
- “ /”从根节点开始选择
- “ //”-忽略上一代标签,并从与选择匹配的当前节点开始
- “ @”-选择“给定属性的节点”,我将使用XPATH和上面的HTML文档来
选择第二个HipHop
绝对路径:- /html/body/musicshop/genre/ul/li[2]未指定索引默认为1
相对路径: -//musicshop//li[2] 要提取,我们包括名称/text()
赋予//musicshop//li[2]/text()
按属性名称选择
//bookstore/bookgenre[@class='fiction'] ```
//bookstore/bookgenre[contains(@class,'fiction')] 也可以使用
Web爬行
我们将从奈拉兰德(Nairaland)第一页中提取新闻链接和主题 。
首先,我们检查Nairaland和我们将要使用的xpath Locator
对于链接: //table[@summary='links]//a/@href
对于Topic://table[@summary='links]//a/text() 应该是直接的解决方案,但是
标记中包含文本 ,因此我们将使用//table[contains(@class,'boards')][2]//tr[2]//a[descendant-or-self::text()]
之后,我们掌握了主要信息,因此我们导入了我们的图书馆
import scrapy
from scrapy.crawler import CrawlerProcess
我们创建蜘蛛类,并从scrapy继承一个Spider
class Spider(scrapy.Spider):
name = 'yourspider'
# start_requests method
def start_requests( self ):
yield scrapy.Request(url = "https://www.nairaland.com/", callback=self.parse)
def parse(self, response):
blocks = response.xpath("//table[contains(@class,'boards')][2]//tr[2]")
News_Titles = blocks.xpath(".//a[descendant-or-self::text()]").extract()
News_Links= blocks.xpath(".//a/@href").extract()
for crs_title, crs_descr in zip( News_Titles, News_Links ):
dc_dict[crs_title] = crs_descr
所以我们开始我们的爬虫程序
process = CrawlerProcess()
process.crawl(Spider)
process.start()
print(dc_dict)