写在前面:
本文以及今后可能发布在本专栏的文章,实际为本人的学习内容输出,写作流程为学习后笔记记录,记录之后整理用尽可能不同的语言作输出,由于笔者水平有限,本专栏仅能看作小白的学习历程,如果能对读者朋友有丝毫微不足道的帮助,笔者欣喜难表。将自己当天或数天学习内容以博客形式做二次输出为本学期以来一直想做但搁置的事,现开始付诸实践,若文章内容有所不妥,还望告知,感激不尽。更新频率希望能保证一周三更以上(作为自我挑战立下的flag),以后“写在前面”可能以“发些牢骚”的形式出现,分享部分当日感想,趣事,或以吐心中块垒。
目录
爬虫入门
文章内容:
爬虫基础(chrome抓包使用与HTTP协议)
爬虫基础库的使用(urllib库基本使用、简单爬虫流程、猫眼数据与知乎登录)
爬虫基础
什么是网络爬虫
通俗理解:爬虫是一个模拟人类请求网站行为的程序。可以自动请求网页、并把数据抓取下来,然后使用一定的规则提取有价值的数据。
Http协议
1、Http协议:全称是HyperText Transfer Protocol,中文意思是超文本传输协议,是一种发布和接收HTML(HyperText Markup Language)页面的方法。服务器端口号是80端口。 HTTPS协议:是HTTP协议的加密版本,在HTTP下加入了SSL层。服务器端口号是443端口。
2、url详解:
URL是Uniform Resource Locator的简写,统一资源定位符。 一个URL由以下几部分组成:
访问协议:一般为http或者https以及ftp等
主机名:域名,比如www.baidu.com
端口号
查找路径:跟在域名后www.jianshu.com/trending/now
查询字符串:跟在?后www.baidu.com/s?wd=python
锚点:用作页面定位或导航
浏览器会对url进行编码,所以我们常会在导航栏看到一堆乱码,除英文字母,数字和部分符号外,其他的全部使用百分号+十六进制码值进行编码。
3、请求方法
4、请求头参数
我们用HTTP协议发送请求时,数据分为三部分:url,body,head
常用head:
User-Agent:浏览器名称。这个在网络爬虫中经常会被使用到。请求一个网页的时候,服务器通过这个参数就可以知道这个请求是由哪种浏览器发送的。如果我们是通过爬虫发送请求,那么我们的User-Agent就是Python,这对于那些有反爬虫机制的网站来说,可以轻易的判断你这个请求是爬虫。因此我们要经常设置这个值为一些浏览器的值,来伪装我们的爬虫。
Referer:表明当前这个请求是从哪个url过来的。这个一般也可以用来做反爬虫技术。如果不是从指定页面过来的,那么就不做相关的响应。
Cookie:http协议是无状态的。也就是同一个人发送了两次请求,服务器没有能力知道这两个请求是否来自同一个人。因此这时候就用cookie来做标识。一般如果想要做登录后才能访问的网站,那么就需要发送cookie信息了。(就是浏览器老是弹出来的那个“我们使用了cookie技术”)
chrome抓包
打开chrome浏览器(或者其它也行):右键->检查或者按下F12即可进行抓包
前面提到的url,User-Agent,Cookie都可以在抓包界面的“网络”下找到
爬虫基础库的使用
urllib
urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。urllib是Python自带的标准库,无需安装,直接可以用。
urlopen函数
from urllib import request
resp = request.urlopen('http://www.sogou.com')
print(resp.read())
#建立一个对象来获取远程数据
函数的返回值为http.client.HTTPResponse对象。有read(size)、readline、readlines以及getcode等方法。
urlretrieve函数
这个函数可以方便的将网页上的一个文件保存到本地。
request.urlretrieve('https://www.sogou.com', 'sogou.html')
# urlretrieve详解
# urlretrieve将网页文件保存到本地
# def urlretrieve(url, filename=None, reporthook=None, data=None)
urlencode与parse_qs
from urllib import parse
data = {'name': '爬虫基础', 'greet': 'hello world', 'age': 100}
qs = parse.urlencode(data) # 传进字典,把汉字转为十六进制编码
# urlencode详解
# 向浏览器发送请求时,汉字和一些字符会转换为编码
# urlencode使用时传入内容是字典
# print(parse.parse_qs(qs))#解码
# urlparse和urlsplit
# parse.urlparse(url)返回超文本链接的组成
# parse.urlsplit(url)返回超文本链接的组成无params
添加请求头
如果刚才不爬取搜狗而去爬取百度,我们会发现爬取失败,因为百度做了反爬虫举措,我们可以通过添加请求头解决这个问题。
# request.Request类
# 增加一些请求头
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko)Chrome/95.0.4638.54 Safari/537.36"
}
rq=request.Request('https://www.baidu.com/?tn=62095104_34_oem_dg',headers=headers)
resp=request.urlopen(rq)
print(resp.read())
小结与实例
通过上面的爬取演示,我们可以总结简单爬取流程如下
定义统一资源定位符url->定义字典型变量headers,里面装我们需要的请求头->使用request.Request建立对象用以解析->使用request.urlopen函数解析对象并保存或输出
爬取猫眼票房数据
from urllib import request
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
}
url = 'https://piaofang.maoyan.com/dashboard/'
rq = request.Request(url=url, headers=headers)
resp = request.urlopen(rq)
print(resp.read().decode('utf-8')) # 解码
知乎模拟登录
现在网络上大多数论坛类网站都有用户登录功能,而我们在爬取这些网站信息是可能就会遇到登录问题,于是我们需要学习如何使用cookie进行登录模拟
# 为了辨别用户身份,进行session跟踪而储存在用户本地的数据 # cookie包含: # Name # value # expires:过期时间 # path # domain:域名 # SECURE:是否只在https下起作用
方法一:
直接在headers字典中直接添加你在登录界面中寻找到的cookie
方法二:
使用http.cookiejar函数(更高端且灵性)
但是我现在实在太困了,鸽一下把使用http.cookiejar放在下次内容将吧,明天(今天)早上直接进行一个早八的翘兄弟们。