了解类加载器

Java创建线程的方式

  返回  

Python3 基础爬虫

2021/8/21 12:01:02 浏览:

1. requests

在Python3中,可以使用urllib.request和requests进行网页爬取。

  • urllib库是python内置的,无需安装
  • requests库是第三方库,需自行安装

1.1 安装命令

pip install requests

1.2 requests的基础方法

方法说明
requests.request()构造一个请求,支撑以下方法的基础方法
requests.get()获取HTML网页,对应HTTP的GET
requests.head()获取HTML网页的头信息,对应HTTP的HEAD
requests.post()向网页提交POST请求的方法,对应HTTP的POST
requests.put()向HTML网页提交PUT请求的方法,对应HTTP的PUT
requests.putch()向HTML网页提交局部修改请求,对应HTTP的PATCH
requests.delete()向HTML页面提交删除请求,对应HTTP的DELETE

官方中文教程地址

2. Beautiful Soup

2.1 安装命令

pip install beautifulsoup4

官方文档

3. 库的导入

import requests
from bs4 import BeautifulSoup 

4. 实战 - 小说爬取

目标网站:https://www.52bqg.net/
首先查看网站的robots.txt文件:https://www.52bqg.net/robots.txt
robots.txt
可以看到除js和css文件外其余内容都是允许爬取的

4.1获取网页内容

import requests
from bs4 import BeautifulSoup

if __name__ == '__main__':
    target = "https://www.52bqg.net/"  # 目标网站
    response = requests.get(url=target)  # 获取网页内容
    print(response.text)  # 打印信息

打印的内容如下:
在这里插入图片描述

4.1.1 解码问题

可以看到目前内容存在很多乱码的问题,需要将爬取到的内容进行转码。在网站中右键 - 检查(F12)可查看网页结构,其中head标签中会存在一个meta的标签指定当前网页使用的编码格式,通过对应的编码格式解码即可。

response.encoding = "gbk"

在这里插入图片描述

4.1.2 自动解码

response.encoding = response.apparent_encoding  # 自动转码

4.2 获取所需的内容

获选取小说的一个章节内容尝试去获取:https://www.52bqg.net/book_121653/43348470.html
如下,小说的内容是要爬取的对象
在这里插入图片描述
使用如下代码获取到网页的文本信息

import requests
from bs4 import BeautifulSoup

if __name__ == '__main__':
    target = "https://www.52bqg.net/book_121653/43348470.html"  # 目标网站
    response = requests.get(url=target)  # 获取网页内容
    response.encoding = response.apparent_encoding  # 自动转码
    print(response.text)  # 打印信息

在这里插入图片描述
从网页结构上可以看到我们需要的内容其实是包含在一个个标签里的,但现在得到的内容是文本,无法通过标签去获取对应的内容,这时就需要Beautiful Soup去解析了

步骤:

  1. 先创建一个Beautiful Soup对象。BeautifulSoup函数里的参数就是我们已经获得的html信息。

  2. find_all方法,获得html信息中所有class属性为xxx的xxx标签。(找存在多个且有规律的标签)

     td = Soup.find_all('td', class_='even')  # 获取所有class属性的td标签
     find_all方法
     - 第一个参数是获取的标签名
     - 第二个参数class_是标签的属性(之所以不是class而是class_,是因为python中class是关键字,为了防止冲突,这里使用class_表示标签的class属性,class_后面跟着的就是属性值了。
    
  3. select 方法,获取对应路径下的值(找有确定路径的)

     Soup.select('#intro > p:nth-child(2)')  # 获取#intro > p:nth-child(2)路径下的内容
    
import requests
from bs4 import BeautifulSoup

if __name__ == '__main__':
    target = "https://www.52bqg.net/book_121653/43348470.html"  # 目标网站
    response = requests.get(url=target)  # 获取网页内容
    response.encoding = response.apparent_encoding  # 自动转码
    html = response.text

	
    soup = BeautifulSoup(html, features="html.parser") # 创建一个BeautifulSoup对象
    info = soup.select('#content')
    print(info)

在这里插入图片描述
在结果中可以看到,目前获取到的是一个列表,提取匹配结果后,使用text属性,提取出文本内容,以此滤除<br>标签。随后使用replace方法,把空格替换为回车进行分段。

&nbsp 在html中用来表示空格

在这里插入图片描述
提取内容的代码如下:

soup = BeautifulSoup(html, features="html.parser")
info = soup.select('#content')
content = info[0].text.replace('\xa0'*8, '\n\n')
print(content)

4.2.1 标签路径的获取

如上述步骤中获取的路径为#content

info = soup.select('#content')

在这里插入图片描述

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号