爬虫:一个简单实例说明爬虫机制

爬虫,我的简单理解就是通过写定的程序,利用计算机的高速的优势,批量高效的获取数据的一种机制。通常我们访问网站是通过浏览器,而爬虫就是通过程序访问网站,也就是让程序伪装成浏览器进行访问。

爬虫:一个简单实例说明爬虫机制

​Request伪装浏览器发送请求应用实例

import requests

res = requests.get(

url='https://blog.csdn.net/BBJG_001', # 我的CSDN个人主页

)

print(res.url)

# https://blog.csdn.net/BBJG_001

print(res.text) # 查看整个网页(html的形式),就是在浏览器中查看网页源代码所看到的的内容

# 这里只截取开始几行来显示

#

#

#

#

# <link>

BeautifulSoup

是一个用来解析html页面的模块,可以接收一个html或xml的字符串,通过其中封装的方法可以很方便的根据标签以及标签的属性获得html页面中的标签所含的内容。

在此之前,爬取的页面的解析往往是通过正则表达式来完成的,而正则表达式的使用不是那么容易的

这里以我的CSDN个人主页为例来说明BeautifulSoup模块的使用

导入支持包

import requests

from bs4 import BeautifulSoup # 解析html网页的

获取网页

res = requests.get(

url='https://blog.csdn.net/BBJG_001', # 我的CSDN个人主页

)

用获取的网页封装BeautifulSoup对象

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

在浏览器中访问上面的网页,按F12查看源码

爬虫:一个简单实例说明爬虫机制

看到目录主体都在class=‘article-list’的div下

展开一个文章项目

爬虫:一个简单实例说明爬虫机制


​其中一个h4标签中封装这标题一行,包含着指向文章详细内容的链接

根据上面的结构从BeautifulSoup中获取内容

div = soup.find(name='div', attrs={'class': 'article-list'})

# find:找到阈值相匹配的第一个标签

# 通过class进行find的时候,要格外注意一下,因为不同的标签的class值可能是相同,

# 这里我通过查看源码确认了该class值只在这个div才有

# 通过id寻找是一种比较准确的方式,因为通过id匹配是唯一的

# 在class相同的情况下,可以通过多指定几个属性的方式增加定位的精确度

h4_list = div.find_all(name='h4')

# find_all:找对与之相匹配的所有标签

a_list = [h4.find(name='a') for h4 in h4_list] # 从h4列表中提取出a标签

data = {}

for a in a_list:

link = a.attrs.get('href') # 获取标签的某个属性

content = a.text# 获取标签中间的内容

print(link)

# 只给出部分做显示

# https://blog.csdn.net/BBJG_001/article/details/104587102

# https://blog.csdn.net/BBJG_001/article/details/104587067

# https://blog.csdn.net/BBJG_001/article/details/104587033

获取图片举例

注意这里跟上面没有什么关系,只是为了介绍这个功能而做的测试

r2 = requests.get('https://imgconvert.csdnimg.cn/aHR0cHM6Ly96eWRzdG9yZS0xMjU4NDc3NzE0LmNvcy5hcC1iZWlqaW5nLm15cWNsb3VkLmNvbS90eXBvcmEvMjAyMDAyMjMxNTE2MDctMTE5ODQ0LnBuZw?x-oss-process=image/format,png')

savepath = r'data/pictures/test01.png'

with open(savepath, 'wb') as f: # 因为下载的是图片,所以是wb,以二进制流写入

f.write(r2.content)

# ret.text 将结果ret转换成字符串,ret.content直接是二进制文件

实际应用中可以find到网页中获得的img标签中的src属性,根据src获取文件,并进行保存,注意保存图片时文件打开方式为wb,f.write()中的传参为二进制形式

防爬虫机制

要说明的是,不是所有的网站内容都是可以爬取,或者说不是那么容易爬取的

浏览器在发送请求时,除了会携带一些服务器所需的认证信息(用户名/密码/token等),还会携带一些浏览器本身的信息,比较简单的防爬虫机制就是去检测发送的信息中的这些浏览器信息,如果信息不完善或不匹配,访问目标可能会驳回通过代码发送的访问请求

通过在代码中追加浏览器信息可以骗过防爬虫措施不到位的网站

山东掌趣网络科技



分享到:


相關文章: