python 爬虫1

1、什么是爬虫

#1、什么是互联网?
    互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。

#2、互联网建立的目的?
    互联网的核心价值在于数据的共享/传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。

#3、什么是上网?爬虫要做的是什么?
    我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。
    #3.1 只不过,用户获取网络数据的方式是:
      浏览器提交请求->下载网页代码->解析/渲染成页面。

    #3.2 而爬虫程序要做的就是:
      模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中
 
    #3.1与3.2的区别在于:
      我们的爬虫程序只提取网页代码中对我们有用的数据

#4、总结爬虫
    #4.1 爬虫的比喻:
      如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据

    #4.2 爬虫的定义:
      向网站发起请求,获取资源后分析并提取有用数据的程序 

    #4.3 爬虫的价值:
      互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,
可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,
掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。

2、爬虫的基本流程:

#1、发起请求
使用http库向目标站点发起请求,即发送一个Request
Request包含:请求头、请求体等

#2、获取响应内容
如果服务器能正常响应,则会得到一个Response
Response包含:html,json,图片,视频等

#3、解析内容
解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等
解析json数据:json模块
解析二进制数据:以b的方式写入文件

#4、保存数据
数据库
文

3、请求与响应:

#http协议:http://www.cnblogs.com/haiyan123/p/7298967.html

#Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)

#Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)

#ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。

4、requests

#1、请求方式:
    常用的请求方式:GET,POST
    其他请求方式:HEAD,PUT,DELETE,OPTHONS

    ps:用浏览器演示get与post的区别,(用登录演示post)

    post与get请求最终都会拼接成这种形式:k1=xxx&k2=yyy&k3=zzz
    post请求的参数放在请求体内:
        可用浏览器查看,存放于form data内
    get请求的参数直接放在url后

#2、请求url
    url全称统一资源定位符,如一个网页文档,一张图片
    一个视频等都可以用url唯一来确定

    url编码
    https://www.baidu.com/s?wd=图片
    图片会被编码(看示例代码)


    网页的加载过程是:
    加载一个网页,通常都是先加载document文档,
    在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求

#3、请求头
    User-agent:告诉它这是浏览器发过来的请求(请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户)务必加上
    host
    cookies:cookie用来保存登录信息
    Referer:上一次的跳转路径


    一般做爬虫都会加上请求头


#4、请求体
    如果是get方式,请求体没有内容
    如果是post方式,请求体是format data

    ps:
    1、登录窗口,文件上传等,信息都会被附加到请求体内
    2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

 用爬虫实现登陆github

import requests
from bs4 import BeautifulSoup

# 获取token
r1 = requests.get('https://github.com/login')
s1 = BeautifulSoup(r1.text,'html.parser')
token = s1.find(name='input',attrs={'name':'authenticity_token'}).get('value')
r1_cookie_dict = r1.cookies.get_dict()
# 讲用户名密码token发送到服务端,post
"""
utf8:✓
authenticity_token:ollV+avLm6Fh3ZevegPO7gOH7xUzEBL0NWdA1aOQ1IO3YQspjOHbfnaXJOtVLQ95BtW9GZlaCIYd5M6v7FGUKg==
login:asdf
password:asdf
commit:Sign in
"""
r2 = requests.post(
    'https://github.com/session',
    data={
        "utf8": '',
        "authenticity_token": token,
        'login': '317828332@qq.com',
        'password': 'alex3714',
        'commit': 'Sign in'
    },
    cookies=r1_cookie_dict
)
# print(r2.text)
# #
r2_cookie_dict = r2.cookies.get_dict()
cookie_dict = {}
cookie_dict.update(r1_cookie_dict)
cookie_dict.update(r2_cookie_dict)
#
r3 = requests.get(
    url='https://github.com/settings/emails',
    cookies=cookie_dict
)
print(r3.content.dict())
github

 一些基本方法:

#requests 7个主要方法
'''
想要了解7个主要方法必须先了解HTTP协议的7个方法,requests的7个与之对应。
其中requests.requests()是其他六个的基础
HTTP:超文本传输协议。
    get:客户端向服务端发起请求,获得资源。请求获得URL处所在的资源。
    post:向服务端提交新的请求字段。请求URL的资源后添加新的数据。
    head:请求获取URL资源的响应报告,即获得URL资源的头部
    patch:请求局部修改URL所在资源的数据项
    put:请求修改URL所在资源的数据元素。
    delete:请求删除url资源的数据
patch与put 比较:
    例如一名学生的信息:姓名:张三;性别:男;学号:123;
    patch提交修改性别。修改后:姓名:张三;性别:女;学号:123;
    put提交修改性别,修改后:姓名:;性别:女;学号:;  这是因为patch是局部的,put必须提交全部数据项,即整个数据元素。增加了带宽
基础函数:
    为什么称为基础:requests库中:
    def requests(method,url,**kwargs)           #**kwargs为可选位置参数
    {
    省略
    }
    def get(url,**kwargs):
        return requests(get,url,**kwargs)
    def post(url,**kwargs):
        return requests(post,url,**kwargs)
    等其他方法,这样做的目的就是方便用户调用,将requests方法封装。
    method有:
    get;post;put;head;delete;patch;
    **kwargs:可选位置参数;
        payload={"key1":"value1"}
        例如:post(url,data=payload)
    常用**kwargs:共13个
        params:字典或字节序列,作为参数添加到URL中
        data:若data=字典,则以form(表单)为Requests内容提交;若data="字符串",则Requests data="字符串"
        json:以json格式数据作为Requests内容。
        headers:字典,模仿浏览器行为,为Requests定制表头
        cookies:字典或CookieJar,作为Requests的cookie。
        proxies:字典,作为代理IP,设定代理服务器
        timeout:设定超时时间,以秒为单位。
        file:字典,传输文件
        
        
        auth:元组,支持HTTP的认证。
        stream:True/False,默认为True,获取内容立即下载;
        verify:True/False 默认为True,认证SSL证书开关。
        allow_redirects:True/False ,默认为True.支持重定向。
        cert:本地ssl路径
requests

两个事例:(实现相同)

import requests
from urllib.parse import urlencode
# 请求方式
kwords = input("请输入关键字:>>").strip()
res = urlencode({"wd":kwords}) #     # 请求的url,当你在百度输入中文的时候,你把url拿下来会变成下面的这样格式的url,所以得urlencode一下
url ="https://www.baidu.com/s?"+res   #https://www.baidu.com/s?wd=%E5%9B%BE%E7%89%87

response = requests.get(
    # 请求的url,当你在百度输入中文的时候,你把url拿下来会变成下面的这样格式的url
    url,
    # 请求头
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",
    },
)
with open("a.html","w",encoding="utf-8") as f:
    f.write(response.text)
# print(response.status_code)
code1
kwords = input("请输入关键字:>>").strip()
response = requests.get(
    "https://www.baidu.com/s?",
    # 请求的url,当你在百度输入中文的时候,你把url拿下来会变成下面的这样格式的url
    params={
        "wd":kwords,
        'pn':20
    },
    # 请求头
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",
    },
)
with open("b.html","w",encoding="utf-8") as f:
    f.write(response.text)
# print(response.status_code)

示例代码二(和上面的结果是一样的)
code2

更多详情:https://www.jianshu.com/p/ada99b7880a6

 

posted @ 2018-07-23 20:00  ivanthor  阅读(115)  评论(0)    收藏  举报