网络爬虫之BeautifulSoup和lxml

一、网络爬虫的概念

1.1 爬虫概念

1.1.1 什么是爬虫

  • 如果我们把互联网比作一张大的蜘蛛网,把互联网上的数据比作网上要捕捉的虫子
    在这里插入图片描述

    爬虫,也就是沿着网络爬取自己的猎物。

  • 技术角度讲:向网站发起请求,获取资源后分析并提取有用的数据的程序

  • 本质上:通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码、JSON数据、二进制数据(视频、图片)爬到本地,进入提取自己需要的数据,存放起来使用

1.1.2 为什么学习爬虫?

  • 大数据时代,要进行数据分析,首先要有数据源,而学习爬虫,可以让我们获取更多的数据源,并且这些数据源可以按我们的目的进行采集,去掉很多无关数据。
  • 从就业角度来说,爬虫工程师目前需求比较大,并且薪资待遇普遍较高

1.2 爬虫流程

  1. 发起请求
    使用 http 向目标站点发起请求,即发送一个Request,发请求需要用到Requests包
  2. 获取响应的内容
    服务器响应正常,会得到一个Response,Response包含:html、图片等
  3. 解析内容
    通过第三方解析库,如:BeatifulSouplxmlscrapyjson解析库
  4. 保存数据
    保存到文件、数据库(mysql、orcel、redis、mongdb)等媒介

二、爬虫常用包

2.1 Requests包

requests包:是一个很实用的python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到的一个模块,可以说,requests完全满足如今网络的请求。

2.1.1 导入Requests包

方法一:通过pip install requests命令进行下载安装,然后在代码中导入。
方法二:在pycharm下载并导入

import requests

(img-hh3qXYXr-1628841855995)(Python爬虫.assets/image-20200309105814980.png)]

这时我们需要下载requests包,下载之前,先配置下载的地址,默认地址在国外,下载比较慢,我们设置为国内的地址:

1) 选择File -> Settings

扫描二维码关注公众号,回复: 13476937 查看本文章

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t2xXeRkX-1628841855998)(Python爬虫.assets/image-20210623103141484.png)]

2) 选择Project Interpreter -> +

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RwTRN25q-1628841856000)(Python爬虫.assets/image-20210623103325985.png)]

3) 选择 Manage Repositories

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wRK0VL5-1628841856001)(Python爬虫.assets/image-20210623103353347.png)]

4) 选中,点击编辑图标:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3R7BUeS-1628841856002)(Python爬虫.assets/image-20210623103442886.png)]

5) 把下面地址放上去,并点击OK保存。

https://pypi.douban.com/simple

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9oKulvnI-1628841856003)(Python爬虫.assets/image-20210623103554155.png)]
接下来,就可以下载包了。

2.1.2 Get请求

import requests

response = requests.get('https://www.baidu.com')

# <class 'requests.models.Response'>
print(type(response))

# 指定编码格式为:utf8,防止乱码
response.encoding = 'utf8'

# 响应体
print(response.text)

2.2 BeautifulSoup库

2.2.1 概念

BeautifulSoup是一个可以从HTML文件中提取数据的一个Python库
导入方式:

from bs4 import BeautifulSoup

创建BeautifulSoup对象:

soup = BeautifulSoup(html, 'html.parser')
  • html:指定要解析的html文本
  • html.parser:指定解析器,html.paerser是python内置的解析器,执行速度适中

如果想通过BeautifulSoup解析数据,还需要调用相关的方法

2.2.2 常用方法

find_all(name, attrs, text)

可以根据标签名,属性,内容查找文档

  • name:指定标签的名字
  • attrs:指定标签的属性
  • text:指定标签中的内容
html = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>第一个html网页</title>
</head>

<body>
    <p>段落1</p>
    <p>段落2</p>
    <p>段落3</p>
</body>
</html>
'''

soup = BeautifulSoup(html, 'html.parser')

# 找到所有的p标签,返回一个列表
all_p = soup.find_all('p')
print(all_p)

输出:

[<p>段落1</p>, <p>段落2</p>, <p>段落3</p>]
<body>
    <p class="class1">段落1</p>
    <p class="class1">段落2</p>
    <p>段落3</p>
</body>
</html>
'''

soup = BeautifulSoup(html, 'html.parser')

all_p = soup.find_all('p', attrs={
    
    'class':'class1'})
print(all_p)

输出:

[<p class="class1">段落1</p>, <p class="class1">段落2</p>]
all_p = soup.find_all('p', attrs={
    
    'class':'class1'}, text='段落1')

输出:

[<p class="class1">段落1</p>]
find(name, attrs, text)

它与find_all唯一的区别是 find_all返回所有满足条件的结果,而find返回匹配结果的第一个

all_p = soup.find('p')

输出:

['class1']
get(attrs)

根据属性名,来获取属性值

# get返回 title对应的值:段落名称
all_p = soup.find('p').get('class1')
print(all_p)

输出:

<p class="class1">段落1</p>

2.2.3 爬取豆瓣前250的书

目的:https://book.douban.com/top250?icn=index-book250-all

  1. 使用谷歌浏览器的开发者工具,按F12键打开开发者模式。

  2. 定位你要爬取的数据所在HTML的位置
    在这里插入图片描述[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCG0ynZc-1628843001816)(.\BeautifulSoup爬虫库.assets\image-20200310110553821.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DlGWa6ee-1628843001818)(.\BeautifulSoup爬虫库.assets\image-20200310110907148.png)]
    在这里插入图片描述

import requests
from bs4 import BeautifulSoup

# 某些网站禁止通过代码访问(反爬虫),在进行request请求时需加入headers参数模拟浏览器访问。
# headers的获取方法见文末。
headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}

html = requests.get('https://book.douban.com/top250?icn=index-book250-all', headers= headers).text

soup = BeautifulSoup(html, 'html.parser')

div_list = soup.find_all('div', attrs={
    
    'class':'pl2'})
for div_book in div_list:
    # .text 是获取标签内的内容
    # print(div_book.find('a').text)
    print(div_book.find('a').get('title'))

print('----------------------------------------')

all_scores = soup.find_all('span', attrs={
    
    'class':'rating_nums'})
for score in all_scores:
    print(score.text)

print('----------------------------------------')

all_book_infos = soup.find_all('tr', attrs={
    
    'class':'item'})
for book_info in all_book_infos:
    book_name = book_info.find('div', attrs={
    
    'class':'pl2'}).find('a').get('title')
    book_score = book_info.find('span', attrs={
    
    'class':'rating_nums'}).text
    print(book_name, book_score)

输出:

红楼梦
活着
百年孤独
1984
飘
三体全集
三国演义(全二册)
白夜行
福尔摩斯探案全集(上中下)
动物农场
小王子
房思琪的初恋乐园
天龙八部
安徒生童话故事集
撒哈拉的故事
哈利•波特
围城
人类简史
沉默的大多数
霍乱时期的爱情
平凡的世界(全三部)
局外人
明朝那些事儿(1-9)
笑傲江湖(全四册)
月亮和六便士
----------------------------------------
9.6
9.4
9.2
9.3
9.3
9.4
9.2
9.2
9.2
9.2
9.0
9.2
9.1
9.2
9.2
9.7
8.9
9.1
9.1
9.0
9.0
9.0
9.1
9.0
9.0
----------------------------------------
红楼梦 9.6
活着 9.4
百年孤独 9.2
1984 9.39.3
三体全集 9.4
三国演义(全二册) 9.2
白夜行 9.2
福尔摩斯探案全集(上中下) 9.2
动物农场 9.2
小王子 9.0
房思琪的初恋乐园 9.2
天龙八部 9.1
安徒生童话故事集 9.2
撒哈拉的故事 9.2
哈利•波特 9.7
围城 8.9
人类简史 9.1
沉默的大多数 9.1
霍乱时期的爱情 9.0
平凡的世界(全三部) 9.0
局外人 9.0
明朝那些事儿(1-99.1
笑傲江湖(全四册) 9.0
月亮和六便士 9.0

Process finished with exit code 0

Requests的参数headers内容获取方法:
按f12进入开发者模式
在这里插入图片描述

2.3 lxml库

2.3.1 什么是lxml

  • lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。效率对比:lxml>正则>beautiful soup
  • XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。参考地址:https://lxml.de/xpathxslt.html

2.3.2 使用方法

  1. 安装 lxml 库
  2. from lxml import etree # etree全称:ElementTree 元素树
  3. selector = etree.HTML(网页源代码)
  4. selector.xpath(路径表达式:一段神奇的符号)
    lxml路径表达式:
表达式 描述
namenode 选取此节点的所有节点
// 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
. 选取当前节点
@ 选取属性

2.3.3 爬取豆瓣前250的电影

import requests
from lxml import etree

# 网站反爬虫
# 反反爬虫:让网站认为这次请求是一次浏览器发起的请求
# 加一个浏览器的身份标识:User-Agent
headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"}

response = requests.get("https://movie.douban.com/top250", headers=headers)
#
selector = etree.HTML(response.text)

movie_list = selector.xpath('//ol[@class="grid_view"]/li')
for movie in movie_list:
    movie_name = movie.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]
    print(movie_name)

猜你喜欢

转载自blog.csdn.net/ljzology/article/details/119657520