Python爬虫基础(一)——HTTP

 

前言

  因特网联系的是世界各地的计算机(通过电缆),万维网联系的是网上的各种各样资源(通过文本超链接),如静态的HTML文件,动态的软件程序······。由于万维网的存在,处于因特网中的每台计算机可以很方便地进行消息交流、文件资源交流······。基于因特网的帮助,我们可以在web客户端(如浏览器等)通过HTTP访问或者下载web服务端(如网站服务器)上面的web资源。

  因特网由TCP/IP统筹,在TCP/IP的基础上进行HTTP活动。HTTP位于TCP/IP的应用层。了解HTTP是为了让爬虫程序模拟客户端的行为去请求服务器数据和反爬虫。

  通过在开发者工具里查看分析网页客户端(浏览器)HTTP的请求报文,获得网页HTTP的请求URL、请求方法、请求头、cookie······,爬虫程序可以完备的模拟浏览器去爬取网站的资源;通过查看分析服务器(网站)返回的HTTP响应报文,了解响应状态,响应主体······,爬虫程序就可以根据这些响应内容去实现程序逻辑、处理响应内容、提取目标信息······

HTTP基础

相关术语

  • Internet:因特网,一种把各个网络联系起来的网络,主要由许多计算机和电缆组成
  • WWW(world wide web):万维网,一种抽象的信息空间
  • web浏览器(web browser):可以显示网页服务器或者文件系统的HTML网页,并让用户与网页交互的软件。
  • Web服务器(Web Server):是驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。一般指网站服务器,
  • HTTP(HyperText Transfer Protocol):超文本传输(转移)协议,处于TCP/IP协议簇的应用层。
  • URL(Uniform Resource Locator):统一资源定位符
  • URI(Uniform Resource Identifier):统一资源标识符
  • URN(Universal Resource Name):统一资源名称
  • HTML(HyperText Markup Language):超文本标记语言
  • TCP/IP(TCP/IP Protocol Suite):TCP/IP协议族,其中一种定义为互联网相关的各类协议族的总称
  • TCP(Transmission Control Protocol):传输控制协议
  • IP(Internet Protocol Address):网际协议地址
  • cookie:一种用户识别机制,一种功能强大且高效的持久身份识别的技术
  • DNS(Domain Name System):域名系统,提供域名到IP地址的解析服务,处于TCP/IP协议簇的应用层。
  • IPv4(Internet Protocol Version 4):网际协议第四版,规定IP长度为32位
  • IPv6(Internet Protocol Version 6):网际协议第六版,规定IP长度为128位

URL

  通常我们说的网址就是一个URL,URL是URI的一个子集,URN也是URI的一个子集,URL和URN存在交集,大概率的情况都是URI=URL,关系如下: 

  当我们在web客户端浏览器输入网址(URL)的时候,如果网址无误,通过HTTP就能得到web服务端的响应。URL语法如下:

  1. scheme:方案,访问web服务器时使用的协议类型,如http:或https:不区分大小写,最后加一个冒号:
  2. user:用户,访问服务器时指定用户登录,为可选项
  3. password:用户密码,和用户相连,可选
  4. host:主机,服务器地址,可以是DNS可解释的域名(人性化)或IPv4/IPv6地址
  5. port:端口号,指定服务器连接的端口号,即监听的端口号,若客户端省略则为默认端口,HTTP默认端口为80
  6. path:路径,指定服务器上的文件路径,定位资源。由一个斜杠/与前面的URL组件分隔开
  7. params:参数,指定输入参数,形式为键值对,用;将其与path的部分隔开。可选
  8. query:查询,为查询字符串,针对已选的路径内的资源,传入参数,用?将其与URL其他部分隔开。可选
  9. frag:片段,为片段标识符,通常标记出以获取的资源的子资源,通过#与URL其它部分隔开,不会传递到服务端,由客户端内部使用。可选

    了解这些是有用的,其中的一个用途就是在爬虫中构建自己的URL请求参数。例如书上所说的如果要爬取作者新的浪微博,由于微博是是ajax的方式加载,需要在开发者工具才能看到ajax请求和服务器的响应,所以请求url需要在开发者工具里查找,经过查找分析,发现xhr(可以查看ajax的请求和响应信息)中的请求URL传入了4个参数(问号后面的即为查询传入的参数),前面三个是不变的,而变化的是最后一个,我们可以利用urllib模块中的urlencode模块来传递这些参数,链接如下:

https://m.weibo.cn/api/container/getIndex?type=uid&value=2830678474&containerid=1076032830678474&page=2

代码如下:

复制代码
import requests from urllib.parse import urlencode base_url = 'upload/201811231058093268.gif" alt="复制代码" style="margin: 0px; padding: 0px; max-width: 660px; height: auto; width: auto; max-height: 100%; border: none !important;" />

  再如要要抓取今日头条一些街拍的图片,在搜索框输入“街拍”二字之后回车便进入到街拍页面,看下网页的url是:upload/201811231058093471.gif" alt="复制代码" style="margin: 0px; padding: 0px; max-width: 660px; height: auto; width: auto; max-height: 100%; border: none !important;" />

import requests from urllib.parse import urlencode   def get_page(offset):     headers = {         'User-Agent': "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0;"                      " .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",     }     params = {         'offset
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信