53

Python实战 | 深度解析网络爬虫利器,轻松获得网站信息

 5 years ago
source link: http://www.10tiao.com/html/314/201807/2672941309/2.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

爬虫介绍

学习Python爬虫过程中,一般使用的库主要是:requests 和BeautifulSoup。其中 requests用于将链接转化成html语言,而BeautifulSoup则用于查找需要的内容。具体爬虫原理,请参考文章:Python实战 | 只需 “4步” 入门网络爬虫(有福利哦)。这两个库是爬虫的主要武器,今天主要分析一下第二个利器BeautifulSoup.


 

BeautifulSoup介绍

Beautiful Soup最主要的功能是使用网页的树形结构和属性等特性来解析网页内容,安装方法如下:


`python`
    pip install beautifulsoup4


在使用bs4解析网页的方法中,一般使用的是通过节点的属性或者过滤器findall()和find()方法。这两个方法都比较繁琐,不够灵活。今天主要是通过采用bs4中的选择器来进行页面解析 。也就是通过网页中的CSS进行选择想要的内容,具体语法是 soup.select()方法。该语法的关键点在于:对于所需内容的精准定位,也就是通过括号()内的语句来实现。


 

什么是css

CSS(Cascading Style Sheets)层叠样式表是一种用来表现HTMLXML等文件样式的计算机语言. 在使用CSS 时,标签名不加任何修饰,类名(class="className"引号内即为类名)前加点,id名(id="idName"引号前即为id名)前加 #。在爬虫中,我们也可以利用类似的方法来筛选元素,在python中的方法是 soup.select(),返回类型是 list,主要通过以下方法进行查找. 

利用Chrome浏览器的检查功能查看网站的css样式。打开科技网页,鼠标放在网页上,右键,选择检查即可看到网页右边多了一个代码部分,具体如下图。


 

通过标签名查找

 标签的话,可以直接寻找。直接在select方法中填写标签名字即可,比如a标签。select方法会返回所有a标签的内容。

使用 Chrom浏览器查看命名为a的标签,然后通过python的select方法选择其对应的内容具体如下:

tag = soup.select('a')
print("===============================")
print("通过标签查询信息:")
print(tag)
print("===============================")



 

通过类名查找

对于html内的内容,可以通过class来进行定位.一般形式为:.类名。

使用 Chrom浏览器查看命名为content的类名,然后通过python的select方法选择其对应的内容。

class_name = soup.select('.content')
print("===============================")
print("通过类名查询信息:")
print(class_name)
print("===============================")


 

通过id名查找

id在一个html中是唯一的,因此可以通过id来找寻唯一的内容.在select方法中,具有语法是“#id名字”. 使用 Chrom查看命名为wrapper的id,然后通过python的select方法选择其对应的内容。

css样式中的ID



代码以及结果如下

id_wrapper = soup.select('#wrapper')
print("===============================")
print("通过ID查询信息:")
print(id_wrapper)
print("===============================")


 

组合查找

组合查找是通过css中的标签名与类名、id名进行的组合。需要注意:空格隔空

打开科技网站的图片标题信息,具体的css样式如下图所示。节点section的子几点h4里面有个a节点包括了title信息。


使用组合方法查找title信息,代码如下如:

#第二种方法:
titles2 = soup.select('section.content > h4 > a')
print('titles is :'.format(titles2))

 结果如下:


 

属性查找

查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。具体如下

`python`
 '''
 print soup.select("head > title")
#[<title>The Dormouse's story</title>]

print soup.select('a[href="http://example.com/elsie"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格


print soup.select('p a[href="http://example.com/elsie"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]


 

介绍一个最简单的方法

 以上的方法可能比较繁琐,因为需要记住id或者class名字等内容,但是Google浏览器给我们提供了一个非常方便的功能:copy slector,直接可以复制css样式。具体路径是:鼠标放在网页上右键->检查->elements->右键选择copy 找到copy selector


实战练习:打开knewone网站,发现很多科技产品,如下图


鼠标放在任何一个商品信息的图片上,然后右键,找到css样式,然后使用bs4中的select方法提取图片信息(把copy到的css样式直接复制到select的方法中即可),具体代码如下:

`python`
 '''
        使用copy获取图片
    '''

    #直接使用cope seletor
    #wrapper > ul > li:nth-child(21) > article > header > a > img
    imgs = soup.select('#wrapper > ul > li > article > header > a > img')


 效果如下,可以看到select方法返回的是一个列表


    任何一个静态网页都可以使用上面的爬取利器爬取下来。是不是很好用,赶快试一下吧。

文末扫码关注

转发此文到朋友圈,并截图到扫码后的公众号后台,

获得20Gpython入门视频课

以及BeautifulSoup中文文档




About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK