一、爬虫介绍
网络爬虫又称网络蜘蛛、网络机器人,是指按照某种规则在网络上爬取所需内容的脚本程序。每个网页通常包含其他网页的入口和大量信息,网络爬虫则是进入网页,定位获取所需内容。
爬虫可以划分为以下三步:
- 爬取网页
- 解析数据
- 保存数据
其中最重要的应该是解析数据这部分,因为这部分编写对应的代码来定位html内容,从而获取我们想要爬取的数据。爬取部分可以通过urllib模块进行获取网页的html代码。保存数据,主要有两种方法,一种是直接保存进Excel,另一种是更面向系统,保存进数据库。我学习的过程使用的是SQLite数据库引擎,小型,方便。特别是运用Pycharm中dataset工具包,使得数据库运用起来是十分的方便。
二、爬取网页
平常登入浏览器上网,最频繁使用的两种请求是get请求和post请求。get请求输入的数据是直接显示在url上,安全性不够。post请求数据是不显示在url上,安全性比较高。(就比如输入密码,是直接在网页上输入,而不是写入url中)
下面代码是get和post请求和返回响应
httpbin.org是一个专门用于爬虫测试的网站
get请求
import urllib.request
response = urllib.request.urlopen('http://httpbin.org/get')
print(response.read().decode('utf-8'))
#响应内容
{
"args": {
},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.9",
"X-Amzn-Trace-Id": "Root=1-61f3ef09-6616eeab295d5103700d9757"
},
"origin": "112.50.41.143",
"url": "http://httpbin.org/get"
}
post请求
data = bytes(urllib.parse.urlencode({
"hellow":"world"}), encoding='utf-8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read().decode('utf-8'))
#响应内容
{
"args": {
},
"data": "",
"files": {
},
"form": {
"hellow": "world"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "12",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.9",
"X-Amzn-Trace-Id": "Root=1-61f3f1af-3c727e890ee174572c7b86fd"
},
"json": null,
"origin": "112.50.41.143",
"url": "http://httpbin.org/post"
}
从上面的响应headers中,可以发现User-Agent的内容是Python-urllib/3.9,说明服务器端知道我们访问的环境,也就是说服务器知道我们在爬虫,对于一些设有安全性的网页会拒绝我们访问。
假如我们通过上述方式正常访问豆瓣网页,会发现出现了如下418警告。
response = urllib.request.urlopen(r'https://movie.douban.com')
print(response.read().decode('utf-8'))
#警告
urllib.error.HTTPError: HTTP Error 418:
那么是不是说明设有安全性的网页就没法访问了,显然,大佬们如此智慧,肯定是有办法解决的。
通过代码伪装浏览器访问头,成功爬取。消息头headers的内容可以通过打开浏览器按F12键,随便点击一个get或post请求,查看消息头即可。以下以火狐浏览器截图为例:
伪装浏览器头消息代码如下:
url = r'https://movie.douban.com'
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.9 Safari/537.36',
'Cookie': 'bid=7mM480uOFCo; dbcl2="252912187:UtqLjbzdBdY"; ck=6DJI; _pk_ref.100001.4cf6=["","",1642433569,"https://accounts.douban.com/"]; _pk_ses.100001.4cf6=*; __utma=30149280.116081932.1642433569.1642433569.1642433569.1; __utmc=30149280; __utmz=30149280.1642433569.1.1.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmz=223695111.1642433569.1.1.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmc=223695111; __utmb=223695111.0.10.1642433569; __utma=223695111.1563560722.1642433569.1642433569.1642433569.1; __gads=ID=c847fa157ddd2521-2202472700d0001e:T=1642433572:RT=1642433572:S=ALNI_Ma_fS0aJS2enPjG0sgam_fOP8ZAfA; push_doumail_num=0; push_noty_num=0; __utmt=1; __utmv=30149280.25291; __utmb=30149280.2.10.1642433569; _pk_id.100001.4cf6=b998428814f5d240.1642433569.1.1642434417.1642433569.; Hm_lvt_eaa57ca47dacb4ad4f5a257001a3457c=1642433569,1642433596,1642434417; Hm_lpvt_eaa57ca47dacb4ad4f5a257001a3457c=1642434417'
}
req = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'