开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
什么是爬虫?
- 爬虫就是
模拟客户端(浏览器)发送网络请求,获取响应,按照规则提取数据的程序 模拟客户端(浏览器)发送网络请求: 照着浏览器发送一模一样的请求,获取和浏览器一模一样的数据
HTTP、HTTPS
-
HTTP:超文本传输协议
- 以明文的形式传输
- 效率更高,但是不安全
-
HTTPS:HTTP + SSL(安全套接字层)
- 传输之前数据先加密,之后解密获取内容
- 效率较低,但是安全
-
get请求和post请求的区别
- get请求没有请求体,post有,get请求把数据放到url地址中
- post请求常用于登录注册,
- post请求携带的数据量比get请求大,多,常用于传输大文本的时候
-
HTTP协议之请求
-
1.请求行
-
2.请求头
-
User-Agent:用户代理:对方服务器能够通过user_agent知道当前请求对方资源的是什么浏览器
- 如果我们需要模拟手机版的浏览器发送请求,对应的,就需要把user_agent改成手机版
-
Cookie:用来存储用户信息的,每次请求会被携带上发送给对方的浏览器
- 要获取登录后才能访问的页面
- 对方的服务器会通过cookie来判断是我们是一个爬虫
-
-
3.请求体
- 携带数据
- get请求没有请求体
- post请求有请求体
-
-
HTTP协议之响应
-
1.响应头
- Set-Cookie:对方该字段设置cookie到本地
-
2.响应体
- url地址对应的响应
-
request模块
- response = requests.get(url) #发送get请求,请求url地址对应的响应
- response = reqeusts.post(url,data={请求体的字典}) ##发送post请求
response
-
response.text
- 该方式往往会出现乱码,出现乱码使用response.encoding="utf-8"
-
response.content.decode()
- 把响应的二进制字节流转化为str类型
-
resposne.request.url 发送请求的url地址
-
response.url 响应的url地址
-
resposne.request.headers 请求头
-
resposne.headers 响应请求
xpath
-
xpath
- 一门从html中提取数据的语言
-
xpath语法
-
xpath helper插件:帮助我们从
elements中定位数据 -
-
选择节点(标签)
/html/head/meta:能够选中html下的head下的所有的meta标签
-
-
-
//:能够从任意节点开始选择
//li:当前页面上的所有的li标签/html/head//link:head下的所有的link标签
-
-
-
@符号的用途
-
选择具体某个元素:
//div[@class='feed']/ul/li- 选择class='feed'的div下的ul下的li
-
a/@href:选择a的href的值
-
-
-
获取文本:
/a/text():获取a下的文本/a//text():获取a下的所有的文本
-
-
示例
这里以爬取猫眼电影网站的电影信息为例。
import requests
from lxml import etree
import json
# 获取请求的url,需要读取多页的数据
def get_url(url_temp):
# 切换页码,下一页操作
url_list = [url_temp.format(i*10)for i in range(6)]
return url_list
# 获取请求的响应体
def get_response(url,headers):
response = requests.get(url,headers=headers)
return response.text
# 解析响应体中需要的内容。
def get_content(html_str):
html = etree.HTML(html_str)
url_list = html.xpath("//dl[@class='board-wrapper']/dd")
content_list = []
for url in url_list:
dict = {}
dict["电影名字"] = url.xpath("./a/@title")[0]
dict["主演"] = url.xpath(".//div[@class='movie-item-info']//p[@class='star']/text()")[0].strip()
dict["评分"] = url.xpath(".//p[@class='score']/i[@class='integer']/text()")[0] + \
url.xpath(".//p[@class='score']/i[@class='fraction']/text()")[0]
dict["图片链接"] = url.xpath("./a/child::*/@src")
dict["电影链接"] = 'https://maoyan.com' + url.xpath("./a/@href")[0]
content_list.append(dict)
print(dict)
return content_list
# 保存我们需要的内容到本地。
def save_content(content_list):
with open("cat_eye.txt","a+",encoding="utf-8")as f:
f.write(json.dumps(content_list,ensure_ascii=False))
def run():
# 要爬的网址
url_temp = "https://maoyan.com/board/4?offset={}"
# 请求头带上浏览器标识
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
url_list = get_url(url_temp)
# 循环遍历url,即一页一页的爬
for url in url_list:
html_str = get_response(url,headers)
content_list = get_content(html_str)
save_content(content_list)
if __name__ == '__main__':
run()
总结
- 发送请求。
- 获取响应体。
- 解析响应体,获取我们需要的信息。
- 将爬取的数据进行保存。