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发过去。
'''

 

原文地址:https://www.cnblogs.com/crazyforever/p/9074652.html