• Python开发之爬虫基础


    爬虫简介

    爬虫:可以把互联网看做是一张大网,爬虫就好像是这张网里的蜘蛛,如果想得到这张网里的资源,就可以将其抓取下来。

               简单来说就是请求网站并提取数据的自动化程序。

    爬虫的基本流程:

    • 发起请求:通过HTTP库向目标站点发送请求,即发送一个request,请求可以包含额外的headers等信息,等待服务器的响应。
    • 获取响应内容:如果服务器能正常响应,会得到一个response,response的内容便是所要获取的页面内容,类型可能是HTML,JSON字符串,二进制数据等类型。
    • 解析内容:得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一  步的处理。
    • 保存数据:保存数据的形式多样,可以保存为文本、也可以保存在数据库,或者保存成特定格式的文件。

    Request和Response过程:

    (1)浏览器就发送消息给该网址所在的服务器,这个过程就叫做HTTP Request

    (2)服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应的处理,然后把消息回传给浏览器,这个过程就叫做HTTP Response

    (3)浏览器收到服务器的Response信息后,会对信息进行处理并展示。

    Request请求:

    • 请求方式:主要是GET、POST两种类型,另外还有HEAD、PUT、DELETE、OPTIONS等。
    • 请求URL:URL全称是同一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL来唯一确定。
    • 请求头:包含请求时的头部信息,如User-Agent、Host、Cookies等。
    • 请求体:请求时额外携带的数据,如表单提交时表单数据。

    Response响应:

    • 响应状态:有多种响应状态,如200代表成功,301跳转,404找不到页面、502服务器错误等
    • 响应头:如内容类型、内容长度、服务器信息、设置cookie等等。
    • 响应体:最主要的部分,包含了请求资源的内容,如网页HTML、图片、二进制数据等。

    简单实例:

    import requests
    
    response= requests.get('http://www.baidu.com')
    print(response.text) # 得到响应体
    print(response.headers) # 得到相应头
    print(response.status_code) # 状态码
    

    能抓什么样的数据?

    • 网页文本,如HTML文档,JSON格式文本等。
    • 图片,获取得到是二进制文件,保存为图片格式。
    • 视频,同为二进制文件,保存为视频格式即可。
    • 其它,只要是能请求到的都可以获取。

    数据处理:

    • 直接处理
    • JSON解析
    • 正则表达式
    • BeautifulSoup
    • PyQuery
    • Xpath

    怎么保存数据

    • 文本,纯文本、json、Xml等
    • 关系型数据库,如Mysql、Oracle等
    • 非关系型数据库,MongoDB、Redis等Key-value形式存储
    • 二进制文件,如图片、视频、音频等直接保存成指定格式即可。

    小例子:

    爬取https://www.autohome.com.cn/news/页面上的a标签的href和图片,并将图片保存于本地

    import requests
    from bs4 import BeautifulSoup
    
    response = requests.get(
        url='https://www.autohome.com.cn/news/'
    )
    response.encoding = response.apparent_encoding  # 解决乱码
    
    soup = BeautifulSoup(response.text,features='html.parser')
    target = soup.find(id='auto-channel-lazyload-article')
    
    li_list = target.find_all('li')
    
    for i in li_list: # 每一个i就是一个soup对象,就可以使用find继续找
        a = i.find('a') # 如果找不到a,调用a.attrs就会报错,所有需要判断
        if a:
            a_href = a.attrs.get('href')
            a_href = 'http:' + a_href
            print(a_href)
            txt = a.find('h3').text
            print(txt)
            img = a.find('img').attrs.get('src')
            img = 'http:' + img
            print(img)
            img_response = requests.get(url=img)
            import uuid
            filename = str(uuid.uuid4())+ '.jpg'
            with open(filename,'wb') as f:
                f.write(img_response.content)
    

    简单总结:

    '''
    response = request.get('url')
    response.text
    resopnse.content
    response.encoding
    response.encoding = response.apparent_encoding
    response.status_code
    '''
    '''
    soup = BeautifulSoup(response.text,features='html.parser')
    v1 = soup.find('div') # 找到第一个符合条件的
    soup.find(id='i1')
    soup.find('div',id='i1')
    v2 = soup.find_all('div')
    
    obj = v1
    obj = v2[0] # 从列表中按索引取到每一个对象
    obj.text
    obj.attrs # 属性
    '''
    

     requests模块介绍

    1、调用的方法关系

    ''''
    requests.get()
    requests.post()
    requests.put()
    requests.delete()
    ...
    上面这些方法本质上都是调用的是requests.request()方法,例如:
    def get(url, params=None, **kwargs):
        r"""Sends a GET request.
    
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
        :param **kwargs: Optional arguments that ``request`` takes.
        :return: :class:`Response <Response>` object
        :rtype: requests.Response
        """
    
        kwargs.setdefault('allow_redirects', True)
        return request('get', url, params=params, **kwargs)
    '''
    

    2、常用参数:

    '''
    requests.request()
    - method:提交方式
    - url:   提交地址
    - params:在URL上传递的参数,GET,例如
        requests.request(
            method='GET',
            url='http://www.baidu.com',
            params={'username':'user','password':'pwd'}
        )
        # http://www.baidu.com?username=user&password=pwd
    - data:在请求体里传递的数据
        requests.request(
            method='POST',
            url='http://www.baidu.com',
            data={'username':'user','password':'pwd'}
        )
    - json:在请求体里传递的数据
        requests.request(
            method='POST',
            url='http://www.baidu.com',
            json={'username':'user','password':'pwd'}
        )
        # json="{'username':'user','password':'pwd'}" 整体发送
    - headers:请求头 
        requests.request(
            method='POST',
            url='http://www.baidu.com',
            json={'username':'user','password':'pwd'},
            headers={
                'referer':'https://dig.chouti.com/',
                'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
            }
        )
    - cookies: cookies,一般放在headers发过去。
    '''

     

  • 相关阅读:
    CMD命令行netsh添加防火墙规则
    C# 编写windows服务及服务的安装、启动、删除、定时执行任务
    C#释放资源文件dll或exe
    .net core 2.1 Razor 超快速入门
    正则表达式的先行断言(lookahead)和后行断言(lookbehind)
    C#从IE缓存读取图片
    实现ppt幻灯片播放倒计时
    C#自动化操作IE浏览器系列之一打开新的浏览器并导航到百度进行搜索
    MT【188】一个正切余切有关的恒等式
    MT【187】余弦的线性组合
  • 原文地址:https://www.cnblogs.com/crazyforever/p/9074652.html
Copyright © 2020-2023  润新知