1.什么是爬虫
爬虫就是 模拟客户端(浏览器)发送网络请求 ,获取响应,按照规则拉取数据的程序 模拟客户端(浏览器)发送网络请求 :照着浏览器发送一模一样的请求,获取和浏览器一模一样的数据
2.爬虫的的数据去哪了
呈现出来:展示在网页上,或者展示在app上 进行分析:从数据中寻找一些规律
3.浏览器的请求
统一资源定位符url
在Chrome中点击检查,点到network url = 请求协议(http&https)+网站的域名+资源的路径+参数 浏览器请求url地址
当前url对应的响应+jd+css+图片——>elements中的内容 爬虫请求url地址
只能请求当前url对应的响应- elements的内容和爬虫获取的 url地址的响应不同,爬虫中需要以当前url地址对应的响应为准提取数据 当前url地址对应的响应在哪里
从network中找到当前的url地址,点击response 或在页面上右键显示网页源码
4.认识HTTP、HTPS
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.请求体
HTTP协议之响应
1.响应头
Set-Cookie:对方服务器通过该字段设置cookie到本地 2.响应体
5. requests模块的学习
使用之前,安装requests库
打开所安装python文件夹中的Scripts 文件夹,打开cmd(输入cmd),输入 pip install resquests 发送get,post请求,获取响应
response = requests.get(url) #发送get请求,请求url地址对应的响应 response = requests.post(url) #发送post请求 response的方法
response.text
该方式往往会出现乱码,出现乱码在之前添加response.encoding=“utf-8” response.content.decode()
response.request.url #发送请求的url地址 response.url #响应请求 response.request.headers #请求头 response.headers #发送请求的url地址 获取网页源码的正确打开方式(通过下面三种方式一定能够获得网页正确源码之后的字符串)
1.response.content.decode() 2.response.content.decode(“gbk”) 3.response.text 发送带headers的请求
为了模拟浏览器,获取和浏览器一模一样的数据 headers = {“User-Agent”:" … “,“Referer”:” … "} response = requests.get(url,headers=headers) 使用超时参数
requests.get(url,headers=headers,timeout=3) #3秒之内必须返回响应,否则会报错 retrying 模块的学习
from retrying import retry
@retry ( stop_max_attempt_number= 3 )
print ( "this is the fun" )
raise ValueError( "this is error" )
处理cookie相关的请求 1.直接携带cookie请求url地址
headers= { "User-Agent" : "....." , "Cookie" : "....." }
cookie字典{ "Name" : "Value" , . . . . . . }
requests. get( url, cookie= cookie_dict)
2.先发送post请求,获取cookie,带上cookie请求登录后的页面
1.session =request.session() #session请求登录后的页面 2.session.post(url,data,headers) #服务器设置在本地的cookie会保存在session中 session.get(url) #会带上之前保存在session中的cookie,能够请求成功
6.数据提取方法
json文件
数据交换格式,看起来像python类型(列表,字典)的字符串 使用json之前需要导入 import json json.loads
把json字符串转化为python类型 json.loads(json字符串) json.dumps
把 python类型抓化为json字符串 json.dumps({}) json.dumps({},ensure_ascii=False,indent=2)
ensure_ascii:让中文显示为中文 indent:能够让下一行在上一行的基础上空格 豆瓣电影电视剧爬虫案例
xpath和lxml方法
xpath
xpath语法
谷歌xpather helper 插件:帮助我们从element中定位数据 1.选择节点(标签)
/html/head/meta
:能够选中html下的head下的所有的meta标签 2.//
:能够从任意节点开始选择
//li
当前页面上的所有的li标签/html/head/link
head下的所有的link标签 3.@符号的用途
选择具体某个元素://div[@class="feed-infinite-wrapper"]/ul/li
(选择class=“feed-infinite-wrapper”的div下的li) a/@href
:选择a的href的值 4.获取文本:
/a/text()
:获取a下的文本/a//text()
:获取a下的所有文本 lxml
from lxml import etree
element = etree. HTML( "html字符串" )
element. xpath( "" )
7.基础知识点的学习
"{}博客" . format ( 1 )
"{}博客" . format ( [ 1 , 2 , 3 ] )
"{}博客" . format ( { 1 , 2 , 3 } )
"{}博客{}" . format ( { 1 , 2 , 3 } , [ 1 , 2 , 3 ] )
列表推导式
帮助我们快速的生成包含一堆数据的列表 [i+10 for i in range(1,10)]
--> [10,11,12,…,19] ["10月{}日".format(i) for i in range(1,20)]
-->[“10月1日”,“10月2日”,…''10月9日"] 字典推导式
帮助我们快速的生成包含一堆数据的字典 {i+10:i for i in range(10)}
–>{10:0,11:1,…19:9} {"a{}".format(i): 10 for i in range(3)}
–> {“a0”:“10”,“a1”:“10”,“a3”:“10”}