爬虫(一)爬虫入门

一、为什么学习爬虫

大数据时代,根据数据分析用户购买意向,从而进行商业相关调整。

只要是浏览器中用户能拿到的,原则上爬虫都可以爬到。

反爬:资源同等,爬虫胜利。

爬虫:灰色地带,带账号权限操作,只是一种便利的获取数据。

黑客:违法,免爬取,付费。

二、爬虫的分类:

通用爬虫:搜索引擎和大型web服务提供的爬虫。弊端:冗余多,占容量。不精准。

聚焦爬虫:针对特定网站的爬虫,定向的获取某方面数据的爬虫。

  •    累积式
  •    增量式
  •    deepweb式

三、爬虫的工作原理

robots协议:君子协议,把握好爬取的度,哪些可以爬,哪些不能爬。

四、编码

爬虫请求回来的数据是bytes类型(二进制)

utf-8 是Unicode的一种实现形式

http请求的过程

  1. 浏览器先向地址栏中的url发起请求,并获取相应

  2. 在返回的响应内容(html)中,会带有css、js、图片等url地址,以及ajax代码,浏览器按照响应内容中的顺序依次发送其他的请求,并获取相应的响应

  3. 浏览器每获取一个响应就对展示出的结果进行添加(加载),js,css等内容会修改页面的内容,js也可以重新发送请求,获取响应

  4. 从获取第一个响应并在浏览器中展示,直到最终获取全部响应,并在展示的结果中添加内容或修改————这个过程叫做浏览器的渲染

五、Python中爬虫库

Requests模块,

特点:(vs urllib)

  1.      简单易用
  2.      Python2,Python3一模一样。
  3.     底层库是urllib

安装:

pip install requests

栗子1:

# requests 模块基本使用
def load_baidu_data():
     # 1.url
     url = 'https://www.baidu.com/'

     # 2.发送请求
     response = requests.get(url)
     # text --> str  (优先使用content)
     data = response.text

     # content -->bytes--->str  (优先使用content)
     data2 = reponse.content.decode('utf-8')

     # 3.验证数据
     print(response)
     print(data)

if __name__ == '__main__':
     load_baidu_data()

requests模块属性介绍:

import requests

# requests 属性简介

def load_baidu_data():

    # 1. 目标url
    url = 'http://www.baidu.com/'

    # 2. 发请求
    response = requests.get(url)

    # 3. 状态码
    code = response.status_code

    # 4. 请求头  user-agent 一个反爬点
    request_headers = response.request.headers

    # 5. 响应头
    response_headers = response.headers

    # 6. 请求的cookies
    request_cookies = response.request.cookies  # request._cookie 版本问题

    # 7. 响应的cookies
    response_cookies = response.cookies


    
if __name__ == '__main__':
     load_baidu_data()
import requests
# import random  # 每次随机获取不同浏览器信息

def load_data():

    url = "http://www.baidu.com/"

    use_headers ={   # 高并发的时候,随机更换此浏览器版本
        'User_Agent': xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    }
    #请求的时候 添加user——agent
    response = requests.get(url, headers = use_headers)

    # bytes --->str
    data = response.content.decode()

    request_headers = response.request.headers

    with open('03headers.html','w')as f:
              f.write()

if __name__ == '__main__':
    load_data()

download_image

import requests

def download_image():

import requests

# 图片的url
url = 'https://www.baidu.com/img/bd_logo1.png' 

# 响应本身就是一个图片,并且是二进制类型
response = requests.get(url) 

# print(response.content)

# 以二进制+写入的方式打开文件
with open('baidu.png', 'wb') as f: 
    # 写入response.content bytes二进制类型
    f.write(response.content)

传参爬虫

我们在使用百度搜索的时候经常发现url地址中会有一个 ?,那么该问号后边的就是请求参数,又叫做查询字符串

eg: https://www.baidu.com/s?wd=python&a=c

请求参数的形式:字典

kw = {'wd':'长城'}

请求参数的用法

requests.get(url,params=kw)

关于参数的注意点

在url地址中, 很多参数是没有用的,比如百度搜索的url地址,其中参数只有一个字段有用,其他的都可以删除 如何确定那些请求参数有用或者没用:挨个尝试! 对应的,在后续的爬虫中,越到很多参数的url地址,都可以尝试删除参数

1.对https://www.baidu.com/s?wd=python发起请求可以使用requests.get(url, params=kw)的方式

2.也可以直接对https://www.baidu.com/s?wd=python完整的url直接发送请求,不使用params参数

request  post请求

  1. 登录注册( POST 比 GET 更安全)
  2. 需要传输大文本内容的时候( POST 请求对数据长度没有要求)

所以同样的,我们的爬虫也需要在这两个地方回去模拟浏览器发送post请求

  • 用法:

      response = requests.post("http://www.baidu.com/", \
      data = data,headers=headers)
    
  • data 的形式:字典

  • 在模拟登陆等场景,经常需要发送post请求,直接使用requests.post(url,data)即可

猜你喜欢

转载自blog.csdn.net/Scrat_Kong/article/details/81508873