爬虫概念
什么是爬虫
爬虫是一个应用程序
是指某一个用于爬取数据的应用程序
爬取的目标可以使整个互联网 也可以是单独的某一个服务器
在CS结构中 爬虫属于client 客户端

爬虫的价值 :
互联网中最有价值的就是数据
爬虫中首要任务就是要通过网络取获取模板服务器的数据;来为自己创造价值

爬虫的流程:
首先明确 我们的爬虫是客户端 要爬的数据在服务器上存储,
所以需要借助网络编程,底层的网络协议已经有现成的封装不需要自己写,
数据传输已经解决,问题是对方给我的数据我能不能看懂 我的数据对方能不能看懂
绝大多数网络传输都是采用的HTTP(*****)

HTTP 协议 超文本传输协议


1.明确要爬取的url地址


2.发送请求
浏览器发送请求
第三方requests模块 pip install requests
内置的urllib模块
selenium (自动化测试模块)用程序驱动浏览器发送请求
之所以用selenium是因为一些网站需要人机交互(点击,拖拽等等操作)

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


3.接收响应
浏览器接受相应后会渲染页面进行展示 无法拿到数据 所以更多情况下使用用浏览器来分析请求详情
requests和urllib都会直接返回响应体
selenium 提供了find_element***的接口用于获取数据


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


5.存储数据
mysql等 关系型数据库
MongoDB redis 非关系型数据库 一般用在高并发爬虫中


接口测试工具postman paw(mac 可以自动生成请求代码)

Scrapy爬虫框架

import requests


key = input("请输入关键字:")


# 手动进行中文编码
#from urllib.parse import urlencode
#print(urlencode({"wd":key},encoding="utf-8"))


url = "https://www.baidu.com/s"     #url地址获取


user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
#模拟浏览器带上版本
resp = requests.get(url,
             params={"wd":key},
             headers = {"User-Agent":user_agent})



with open("baidu.html","wb") as f:
    f.write(resp.content)
    #print(resp.text)
小试牛刀 抓取下百度搜索页面,

#注意 先要安装 pip3 install requests 模块

"""
1.获取token
地址:https://github.com/login
token放在了响应体中


"""
import requests,re
# 1.获取token
login_page_url = "https://github.com/login"
resp = requests.get(login_page_url) # 请求首页
# 获取返回的cookie
cookie = resp.cookies.get_dict()
token = re.search('authenticity_token" value="(.*?)" /> ',resp.text).group(1) # 获取token





# 2.请求登录接口
login_url = "https://github.com/session"
resp2 = requests.post(login_url,
              headers={
                  "Referer": "https://github.com/login",
                  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
              },
              data={"commit": "Sign in",
                    "utf8": "",
                    "authenticity_token": token,
                    "login": "oldboyedujerry",
                    "password": "123654asdAsd",
                    "webauthn-support": "supported"},
              cookies = cookie)
#data 是post 发送请求带上用户名,密码等信息发送上去
print(resp2.status_code)        #查看状态吗
with open("github_home.html","wb") as f:
    f.write(resp2.content)
print("oldboyedujerry/testProject" in resp2.text)
模拟登录带有cookie与session的页面方法

 

import requests

# 最常用的两个函数
# requests.get()
# requests.post()


url = "https://www.baidu.com/s"

resp = requests.get(url,params={"wd":"egon"},headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3538.77 Safari/537.36"})

print(resp.text)              #显示是文档形式的
print(resp.content)           #显示是二进制形式,用于存视频,图片等
print(resp.status_code)       #显示的是状态码
print(resp.url)               #显示url地址出来
print(resp.cookies) # 获取返回的cookies信息
print(resp.cookies.get_dict()) # 获取返回的cookies信息
# print(type(resp.json()))# 将结果进行反序列化
print(resp.request) # 请求方式
从文档中获取编码方式
print(resp.apparent_encoding)
print(resp.encoding)
print(resp.headers) # 查看响应头
print(resp.history) # 重定向历史   即前一次请求的地址
print(resp.url) # 当前地址
requests的属性
# 对于返回值为json格式的处理

# jsonresp = requests.get("http://v.juhe.cn/toutiao/index?key=1f1ed574dda497de207ccca4d9999d7f")
#
# print(type(jsonresp.text))
# print(type(jsonresp.json()))
#
# print(jsonresp.json())

 

# 代理池  ********   对于爬虫而言是相当重要的一个参数
# ps = ["121.228.240.101:9999","121.228.240.101:9999","121.228.240.101:9999","121.228.240.101:9999"]
# import random
# # 使用代理服务器请求
# resp = requests.post("http://news.baidu.com/?tn=news",proxies={"HTTP":random.choice(ps)})
# with open("ttt.html","wb") as f:
#     f.write(resp.content)
# print(resp.text)
使用Ip代理池的方式,爬取数据
import requests

# 给服务器传参数
# requests.get("url",params={"key":'value'})

# post请求 data和json都能传参数
# requests.post("url",data={"name":"jerry","pwd":"123"},json={"name":"jerry","pwd":"123"})
# data 拼接为:name=jerry&pwd=123
# json 直接序列化成字符串 {"name":"jerry","pwd":"123"}


# 超时时间 第一个表示连接超时时间 2表示响应超时时间
# requests.post("https://www.baidu.com",timeout=(10,10))
posted on 2019-04-15 20:39  kaikai2xiaoqi  阅读(134)  评论(0编辑  收藏  举报