爬虫简介,爬虫流程,浏览器分析请求(有用信息),模拟get请求,session模拟发请求, get请求常用参数,post请求常用参数, 验证请求是否成功

爬虫简介

爬虫是一个位于客户端(Client)的,用于爬取数据的应用程序
爬取得目标:
  整个互联网,某一单独服务器。 爬虫的价值: 互联网中最有价值的就是数据
爬虫首要任务就是通过网络取获取模板服务器的数据;来为自己创造最大价值。

爬虫原理:
  分析浏览器与服务器之间到底是如何通讯的,然后模拟浏览器来与服务器通讯,从而获取数据。

爬虫流程

明确爬取得数据
借助网络编程,传输数据(HTTP协议)
1. 明确爬取的url地址
2. 模拟发送请求
    _借助第三发模块(requests) # 推荐使用
        安装:pip3 install requests
        requests.get() 模拟发送get请求
        requests.post() 模拟发送post请求
    _python内置的模块(urllib)
    _Selenium (自动化测试模块)用程序驱动浏览器发送请求

    _针对移动app可以使用代理服务器,可以截获app端发送的请求信息 Charles(青花瓷)

3. 接受响应(一般通过浏览器分析请求详情)
    requests,urllib模块直接返回响应体
        # eg: response = request.get("https://www.pearvideo.com")
        #     response.text  # 接受的字符串信息
        #     response.content  # 接受的Bytes类型
    Selenium模块提供了find_element***的接口用于获取数据
        eg:

4. 解析数据
    re 正则表达式
    BeautifulSoup 封装了常用的正则表达式
    移动端返回的/ajax返回的json数据 直接json.load

5. 存储数据
    mysql存储,redis存储,文件存储( json形式 )

浏览器分析请求(有用信息)

主要接口分析

# Request URL: https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=2&start=12&mrd=0.05746713547672622&filterIds=1540723,1540697,1540834,1541181,1541182,1541173,1541149,1540993,1541086,1541105,1540503,1541041,1541053,1541046,1541003
分析有用接口:https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=2&start=12  (手动模拟测试分析)

 

 

 

请求链接地址

 请求头里的重要信息

 

分析请求头有用信息

user-agent  用来识别客户端类型(是否是浏览器)
refer 用来识别用户从哪个页面过来的
Cookie 一般用来当页面需要验证用户身份时 使用

分析响应头有用信息

location   当请求被重定向时 就会带有该字段  可以通过状态码30* 来识别重定向

模拟get请求

获取连接地址 ,request.get(url)

resp = requests.get(url=url)  # requests模块模拟发get请求
if resp.status_code == 200:  # 获取响应的状态码
    print("响应成功")
    print(resp.text)  # 请求回来的数据字符串类型
    print(resp.content)  # 请求回来的数据 bytes类型
    result = re.findall('<a href="(video_\d+?)" class="vervideo-lilink actplay">', resp.text)  # 找我想要数据进行过滤

解析标签

result = re.findall('<a href="(video_\d+?)" class="vervideo-lilink actplay">', resp.text)  # 找我想要数据进行过滤
for i in result:
    detail_url = "https://www.pearvideo.com/" + i
    # 请求头:
    detail_result = requests.get(detail_url)
    # 标题
    title = re.search('<h1 class="video-tt">(.*?)</h1>', detail_result.text).group(1)
    # print(title)
    # 点赞
    up_count = re.search('<div class="fav" data-id="\d+">(\d+?)</div>', detail_result.text).group(1)
    # print(up_count)
    # 详情内容
    detail_content = re.search('<div class="summary">(.*?)</div>', detail_result.text).group(1)
    # print(detail_content)
    # 作者名字
    author_name = re.search('alt=".*"></i>(.*?)</div>', detail_result.text).group(1)
    # print(author_name)

    video_url = re.search('srcUrl="(.*?)"', detail_result.text).group(1) # 解析视频链接地址
    # print(video_url)

    # 将爬取的信息存入字典
    detail_dic = {"title": title, "up_count": up_count, "detail_content": detail_content,
                  "author_name": author_name, "video_url": video_url}
get_dic_list.append(detail_dic)  # 循环玩以后全部加入一个列表里

下载视频

# 拿着视频地址,模拟发请求
video_result = requests.get(video_url)
path
= str(video_path) + "/" + str(author_name) + str(random_num) + ".mp4" with open(path, "wb") as f: f.write(video_result.content) # 发的是视频的连接地址,响应回来的就是视频的bytes文件 print("下载好了")

存入文件

path = datajs_path + "/" + "get_dic_list.json"
# 爬取的数据持久化处理
with open(path, "wt") as f:
    json.dump(get_dic_list, f)   # 自动写入json的字符串

get请求常用参数

url , params , headers 参数

url: 请求的链接地址
headers : 请求头携带的数据
params:get : 请求携带的数据



url = "https://www.baidu.com/s" # s 代表get请求携带的数据的占位符 response = requests.get(   url=url, # 表示请求的路由   params={"wd":"美女"}, # get请求携带的数据   headers={"User-Agent":User_Agent}, # 请求头携带的数据
              data={...} # 请求体携带数据
)

cookies参数

取Cookie

url = 'https://github.com/login'
resp = requests.get(url=url, headers={"User-Agent": User_Agent})
# print(type(resp.cookies))
cookie = resp.cookies.get_dict()   # 获取cookie

cookie携带方式一

login_url = 'https://github.com/session'
response = requests.post(
    url=login_url,
    headers={  # 请求头携带数据
        "User-Agent": User_Agent,   # 识别请求是浏览器发送
        # 携带cookie数据(手动改成字典的形式传入)
        "Cookie":"has_recent_activity=1; _ga=GA1.2.1969485734.1554949588; _octo=GH1.1.477478330.1554949588; tz=Asia%2FShanghai; _device_id=6e2ef5508aa3004b4fe2de6691015327; logged_in=no; _gh_sess=blMyUDk1ZVF2RnBvMDQzSExyZWVKa09WaUFiUVZ6TXJ
        # cookies={"has_recent_activity":1,"_ga":"GA1.2.1969485734.1554949588","_octo":"GH1.1.477478330.1554949588"......}
    },
)

cookie携带方式二,推荐使用

login_url = 'https://github.com/session'
response = requests.post(
    url=login_url,
    headers={  # 请求头携带数据
        "User-Agent": User_Agent,   # 识别请求是浏览器发送
    },
    cookies=cookie  # 携带cookie数据(requests模块封装了)  ,推荐使用
)

session模拟发请求

session自动帮我们处理cookie,提交cookie

user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
# 创建一个会话
session = requests.session()  # 以后用session来模拟发请求,自动帮我们提交cookie

# 1.请求登录页面
res = session.get(
  url="https://github.com/login", # 请求的地址
  headers={ # 请求头携带数据   "Referer": "https://github.com/",   "User-Agent": user_agent # 模拟浏览器发请求   }
)

post请求常用参数

data参数,请求体携带 账号/密码/token 等数据

# 获取token,(token只是隐藏了,html界面能够找到)
url = 'https://github.com/login'
User_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'
resp = requests.get(url=url, headers={"User-Agent": User_Agent})
token = re.search('name=".*?_token" value="(.*?)" />', resp.text).group(1)  # 获取token


login_url = 'https://github.com/session'
response = requests.post(
  url=login_url,
  headers={  # 请求头携带数据
      "User-Agent": User_Agent,
  },
  data={  # 请求体携带数据
      "authenticity_token": token,  # 模拟携带token
      "login": "liu-huan-github",   # 模拟携带账号
      "password": "l.13327316050",   # 模拟携带密码
  },

验证请求是否成功

方法1:
print
(resp.status_code) # 验证请求状态码是否符合
  resp = requests.get(url=url) # requests模块模拟发get请求
  if resp.status_code == 200: # 获取响应的状态码


方法2:
  print("oldboyedujerry/testProject" in resp.text) # 首先登陆成功,查看用户名是否在我爬取的界面里,在表示登陆请求发送成功

 

posted @ 2019-04-11 14:08  星牧  阅读(719)  评论(0编辑  收藏  举报