1.爬虫介绍
网络爬虫,又称为网页蜘蛛,网络机器人,是由代码编写,按照一定的规则,自动抓取互联网信息的程序或者脚本。Python由于简单易用的特性,深受程序员的喜爱,特别适合用于爬虫。在Python语言中,三行代码就可以写一个简单的爬虫程序,这是其他编程语言无法企及的。
2.爬虫原理
(1)浏览器发送请求给服务器,请求方式主要分为GET,POST两种类型。
(2)服务器接收到浏览器发送的请求后,根据请求内容做出相应处理,然后把消息回复给浏览器。
(3)浏览器收到服务器的响应信息后,会对信息进行相应处理,然后展示给用户。
我们编写爬虫程序,就是模拟浏览器,给服务器发送请求,然后获取服务器响应的数据,并对数据进行分析与处理。
3.爬虫协议
网站出于安全和隐私考虑,可以建立一个robots.txt文件,来告诉搜索引擎哪些页面可以爬取,哪些页面不能爬取,而搜索引擎则通过读取robots.txt文件来识别这个页面是否允许被爬取。这是个约定俗成的“君子协议”,我们在爬取网站数据时一定要遵守。比如:我们可以通过输入网址 https://www.baidu.com/robots.txt 来查看百度的robots协议。
4.小试牛刀
光说不练假把式,看了这么多,我们先写个最简单的爬虫程序试一下吧。Python爬虫离不开requests包,这个库是第三方的,如果没有的话,可以在cmd命令行执行语句:pip install requests。
然后输入以下代码:
import requests
url = 'https://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.62'
}
resp = requests.get(url, headers=headers)
print(resp.text)
响应内容如下,这就说明我们爬取成功了
接下来,我想把服务器响应的内容保存到本地,涉及到文件操作,写入的编码形式改为UTF-8
import requests
url = 'https://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.62'
}
resp = requests.get(url, headers=headers)
html = resp.text
print(html)
with open('baidu.html', 'w', encoding='utf-8') as f:
f.write(html)
f.flush()
f.close()
print('保存完毕')
如果把前面的头文件去掉,再请求会怎样?
import requests
url = 'https://www.baidu.com'
resp = requests.get(url)
print(resp.text)
我们发现响应的内容有问题,说明这次爬取,让服务器觉察到我们了。
服务器为什么能觉察到我们呢?当然是缺少请求头文件了
5.User-Agent
请求头里最重要的元素就是User-Agent(用户代理)。网站服务器通过识别 UA来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息,进而给不同的用户回复相应的页面。因此,服务器可通过识别请求头中 User-Agent 信息来判断本次请求是否是爬虫行为。如果是,服务器就会回复不相干的信息,甚至限制其IP访问。所以我们在爬取的时候尽量加上头文件headers,并在headers字典中加入User-Agent,这样才能让我们的程序模拟浏览器访问网站。
常见的浏览器请求头如下
系统 | 浏览器 | User-Agent字符串 |
Mac | Chrome | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36 |
Mac | Firefox | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:65.0) Gecko/20100101 Firefox/65.0 |
Mac | Safari | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15 |
Windows | Edge | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763 |
Windows | IE | Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko |
Windows | Chrome | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 |
iOS | Chrome | Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/31.0.1650.18 Mobile/11B554a Safari/8536.25 |
iOS | Safari | Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4 |
Android | Chrome | Mozilla/5.0 (Linux; Android 4.2.1; M040 Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36 |
Android | Webkit | Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; M351 Build/KTU84P) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 |