Python爬虫流程

爬虫基本流程

  • 发起请求
    通过HTTP库向目标服务器发送Request,Request内可以包含额外的headers信息。
  • 获取响应内容
    如果服务器正常响应,会返回Response, 里面包含的就是该页面的内容。
  • 解析数据
    内容或许是HTML,可以用正则表达式、网页解析库进行解析。
    或许是Json,可以直接转换为Json对象解析。
  • 保存数据
    可以存储为文本,也可以保存至数据库,或其他特定类型文件。

Request和Response

  • Request
    主机向服务器发送数据请求时的过程叫做HTTP Request
  • Response
    服务器向主机返回数据的过程叫做HTTP Response

Request中包含的内容

  • 请求方式
    常用的有GET,POST两种类型。
    • GET
      这种请求方式的参数都包含在网址里面。
    • POST
      这种请求方式的参数包含在请求体中的form data中。相对安全。
  • URL
    请求的网络链接。
  • 请求头
    包含请求时的头部信息。如:User-Agent、Host、Cookies等。
    • User-Agent
      指定浏览器。
  • 请求体
    GET请求下一般情况请求体中不会包含重要信息。
    POST请求中包含重要信息。

Response中包含的内容

  • 响应状态
    Status Code:200
    即状态码,一般200表示响应成功。
  • 响应头
    Response Headers
    内容类型,内容长度,服务器信息,设置Cookie等。
  • 响应体
    请求资源的内容,如网页源代码,二进制数据等。

简单演示:

#requests是一个HTTP请求库
>>> import requests
#利用requests库的get()函数获取指定URL的response
>>> response = requests.get("http://www.baidu.com")

#打印response中的响应体
>>> print(response.text)

#打印响应头
>>> print(response.headers)

#打印状态码
print(response.status_code)

获取图片

#requests是一个HTTP请求库
>>> import requests
#利用requests库的get()函数获取指定URL的response
>>> response = requests.get("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507915046492&di=c543439d4e643acb2fc8ed72e48c6b32&imgtype=0&src=http%3A%2F%2Fi.dimg.cc%2F9c%2F61%2Fc9%2Fb2%2F66%2Fc6%2F38%2F1a%2F0c%2F29%2F67%2F6d%2F6c%2Fcf%2Fb3%2F6f.jpg")

#打印该图片的二进制数据
>>> print(response.content)

#利用with open语句进行文件的本地写入,open()函数第一个参数为文件名,第二个参数为写入模式。
>>> with open("demo.jpg","wb") as f:
...     f.write(response.content)
...     f.close()
... 
#写入字节数,说明写入成功。
30361

一般做网页请求的时候,可以先判断状态码是否是200,再取出响应体进行解析。

解析方式

  • 直接处理
  • Json解析
  • 正则表达式
  • BeautifulSoup
  • PyQuery
  • XPath

视情况选择合适的解析方式。

保存数据

  • 文本保存
    纯文本、Json、Xml等。
  • 关系型数据库保存
    MySQL、Oracle、SQLServer等。
  • 非关系型数据库保存
    MongoDB、Redis等Key-Value形式存储。
  • 二进制文件
    图片、视频、音频等特定文件。

Urllib库

Python内置的HTTP请求库

模块 说明
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse url解析模块
urllib.robotparser robots.txt解析模块

- urlopen()
发送request请求给服务器,该函数内常用参数有三个。
urllib.request.urlopen(url,data=None,[timeout,]*)
第一个参数是请求的链接地址,第二个参数是POST请求时需要的数据,第三个参数是超时的设置。
“`python
import urllib.parse
import urllib.request

#GET请求演示
response = urllib.request.urlopen("http://www.baidu.com")
#decode()函数指定编码格式。
print(response.read().decode("utf-8"))


#POST请求演示
data = bytes(urllib.parse.urlencode({"word":"hello"}),encoding="utf8")
response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read())

#超时参数演示,如果没有在设置的时间内响应就会抛出异常。
response = urllib.request.urlopen("http://httpbin.org/get",timeout=1)
print(response.read())
```

- 响应
- 响应类型
“`python
import urllib.request

     response = urllib.request.urlopen("http://www.python.org")
     #type()查看变量数据类型
     print(type(response))
    ```
- 状态码、响应头
    ```python
    import urllib.request

    response = urllib.request.urlopen("http://www.python.org")

    #输出状态码,判断是否响应成功
    print(response.status)

    #输出响应头
    print(response.getheaders())

    #输出响应头特定字段("Server")
    print(response.getheader("Server"))
    ```

- URL解析

你可能感兴趣的:(Python)