爬虫,我的简单理解就是通过写定的程序,利用计算机的高速的优势,批量高效的获取数据的一种机制。通常我们访问网站是通过浏览器,而爬虫就是通过程序访问网站,也就是让程序伪装成浏览器进行访问。
-
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的形式),就是在浏览器中查看网页源代码所看到的的内容 # 这里只截取开始几行来显示 # <!DOCTYPE html> # <html lang="zh-CN"> # <head> # <meta charset="UTF-8"> # <link rel="canonical" href="https://blog.csdn.net/BBJG_001"/>
-
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等),还会携带一些浏览器本身的信息,比较简单的防爬虫机制就是去检测发送的信息中的这些浏览器信息,如果信息不完善或不匹配,访问目标可能会驳回通过代码发送的访问请求
通过在代码中追加浏览器信息可以骗过防爬虫措施不到位的网站
相关文献
在Python应用正则表达式