python获取字符串第几个字符之前的字符串 取字符串的第几个字符 python_HTTP


爬虫简介

•网页爬取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。

•请求网站并提取数据的自动化程序

爬取网页的基础知识-HTTP协议

1.HTTP协议简介

超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。1999年6月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1。

2014年12月,互联网工程任务组(IETF)将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。

1.HTTP协议概述

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

2.HTTP工作过程

(1)客户端与服务器建立连接。

(2)服务器接到请求后,给予相应的响应信息。

(3)客户端接收服务器所返回的信息,浏览器解析并显示网页。

3.HTTP工作过程

HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

(1)客户端与服务器建立连接。

(2)发送HTTP请求

(3)服务器接到请求后,给予相应的响应信息。

(4)释放连接TCP连接

(5)客户端接收服务器所返回的信息,浏览器解析并显示网页。

爬虫过程

发起请求:通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应

获取响应内容:如果服务器能正常响应,会得到一个Response,获得的页面内容有Html,Json字符串,二进制数据(如图片,视频等)

解析内容:得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是Json,可以直接转为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理。

保存数据:保存形式多样,可以存为文本,也可以保存至数据库,或者保存特定格式的文件。

爬取网页的基础知识-HTTP请求方法

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。


python获取字符串第几个字符之前的字符串 取字符串的第几个字符 python_服务器_02


所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔


python获取字符串第几个字符之前的字符串 取字符串的第几个字符 python_html_03


URL是Uniform Resource Locator的缩写,即统一资源定位系统,也就是网址。

URL 遵守一种标准的语法,它由协议、主机名、域名、端口、路径、以及文件名这六个部分构成,


python获取字符串第几个字符之前的字符串 取字符串的第几个字符 python_html_04


HTML与JavaScript基础-网页结构

1.网页一般由三部分组成,分别是 HTML(超文本标记语言)、CSS(层叠样式表)和 JScript(活动脚本语言)。

2.HTML是整个网页的结构,相当于整个网站的框架。带“<”、“>”符号的都是属于 HTML 的标签,并且标签都是成对出现的

3.常见的标签如下


<html>..</html> 表示标记中间的元素是网页
<body>..</body> 表示用户可见的内容
<div>..</div> 表示框架
<p>..</p> 表示段落
<li>..</li>表示列表
<img>..</img>表示图片
<h1>..</h1>表示标题
<a href="">..</a>表示超链接


4.CSS

CSS 表示样式,<style type="text/css">表示下面引用一个 CSS,在 CSS 中定义了外观。

5. JScript 表示功能。交互的内容和各种特效都在 JScript 中,JScript 描述了网站中的各种功能。

如果用人体来比喻,HTML 是人的骨架,并且定义了人的嘴巴、眼睛、耳朵等要长在哪里。CSS 是人的外观细节,如嘴巴长什么样子,眼睛是双眼皮还是单眼皮,是大眼睛还是小眼睛,皮肤是黑色的还是白色的等。JScript 表示人的技能,例如跳舞、唱歌或者演奏乐器等。

网络爬虫-使用Python和urllib、Beautiful Soup库抓取网页数据,并输出想要的内容至plist文件中

节包含内容如下:
1、抓取数据的必备知识(获取及打印网页内容)
2、使用BeautifulSoup库的必备知识
3、使用Beautiful Soup库抓取网页数据,并输入想要的内容至plist文件中示例
1、抓取数据的必备知识(获取及打印网页内容)

以要抓取某个网站上的东西为例,


#-*- coding:utf-8 -*-
import urllib.request
resp=urllib.request.urlopen('http://www.baidu.com')
html=resp.read()
print(html)


1.urllib库

Python3.x标准库urllib提供了urllib.request、urllib.response、urllib.parse和urllib.error四个模块,很好地支持了网页内容读取功能。再结合Python字符串方法和正则表达式,可以完成一些简单的网页内容爬取工作,也是理解和使用其他爬虫库的基础。

2. 使用urllib库获取网页信息

使用 urllib.request.urlopen()函数可以打开一个网站,读取并打印网页信息。

urllib.urlopen(url, data[, proxies])

urlopen()函数返回response对象

函数的参数url表示远程数据的路径;data表示提交到url的数据;proxies用于设置代理。2. 使用urllib库获取网页信息

response对象的方法

info()方法:

getcode()方法:返回HTTP状态码。如果是HTTP请求,200表示请求成功完成,404表示网址未找到。

geturl():返回请求的url。

1.读取并显示网页内容

>>> import urllib.request

>>> fp = urllib.request.urlopen(r'http://www.python.org')

>>> print(fp.read(100)) #读取100个字节

>>> print(fp.read(100).decode()) #使用UTF8进行解码

>>> fp.close() #关闭连接

2.提交网页参数

(1)下面的代码演示了如何使用GET方法读取并显示指定url的内容。

>>> import urllib.request

>>> import urllib.parse

>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})

>>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params

>>> with urllib.request.urlopen(url) as f:

print(f.read().decode('utf-8'))

(2)使用POST方法提交参数并读取指定页面内容。

>>> import urllib.request

>>> import urllib.parse

>>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})

>>> data = data.encode('ascii')

>>> with urllib.request.urlopen("http://requestb.in/xrbl82xr",

data) as f:

print(f.read().decode('utf-8'))

3.使用HTTP代理访问页面

>>> import urllib.request

>>> proxies = {'http': 'http://proxy.example.com:8080/'}

>>> opener = urllib.request.FancyURLopener(proxies)

>>> with opener.open("http://www.python.org") as f:

f.read().decode('utf-8')

使用BeautifulSoup库的必备知识

  • ①、不能创建bs4.py的文件,会造成与系统冲突,同时在from bs4 import BeautifulSoup代码处报错
  • ②、soup = BeautifulSoup(html, 'html.parser')不要漏写解析器,要不然会有No parser was explicitly specified, so I'm using the best available HTML par警告
  • ③、更多问题可查看Beautiful Soup 4.4.0 官网文档

3、使用Beautiful Soup库抓取网页数据,并输出想要的内容至plist文件中示例


#-*- coding:utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup

import importlib,sys 
importlib.reload(sys)

# 函数
def  printPlistCode():
    #1.得到这个网页的 html 代码 #
    html = urllib.request.urlopen("http://movie.douban.com/chart").read()

    #2.转换 一种格式,方便查找
    #soup = BeautifulSoup(html, 'html.parser')
    soup = BeautifulSoup(html,'lxml')
    print(soup.prettify())
    print(soup.title)
    print(soup.title.name)
    print(soup.title.string)
    print(soup.title.parent.name)
    print(soup.p)
    print(soup.p["class"])
    print(soup.a)
    print(soup.find_all('a'))
    print(soup.find(id='link3'))
    print("n")
    print("n")
    print("n")

    #3.  得到 找到的所有 包含 a 属性是class = nbg 的代码块,数组
    liResutl = soup.findAll('a', attrs = {"class" : "nbg"})
    #4.用于拼接每个字典的字符串
    tmpDictM = ''

    #5. 遍历这个代码块  数组
    for li in liResutl:

        #5.1 找到 img 标签的代码块 数组
        imageEntityArray = li.findAll('img')

        #5.2 得到每个image 标签
        for image in imageEntityArray:
            #5.3 得到src 这个属性的 value  后面也一样 类似 key value
            link = image.get('src')
            imageName = image.get('alt')
            #拼接 由于 py中 {} 是一种数据处理格式,类似占位符
            tmpDict = '''@{0}@"name" : @"{1}", @"imageUrl" : @"{2}"{3},'''

            tmpDict =  tmpDict.format('{',imageName,link,'}')

            tmpDictM = tmpDictM + tmpDict

    #6.去掉最后一个 , 
    tmpDictM = tmpDictM[0:len(tmpDictM) - 1] #为了能输出原生中文不要进行.encode('utf8')


    #7 拼接全部
    restultStr = '@[{0}];'.format(tmpDictM)

    print(restultStr)


if __name__ == '__main__':
    printPlistCode()