任务预览(2天)
1. 学习get与post请求,尝试使用requests或者是urllib用get方法向https://www.baidu.com/发出一个请求,并将其返回结果输出。
# 此代码是使用requests库向百度发出请求
import requests
def main():
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
response = requests.get('https://www.baidu.com/', headers=HEADERS)
response.encoding = 'utf-8'
print(response.status_code)
if __name__ == '__main__':
main()
2.如果是断开了网络,再发出申请,结果又是什么。了解申请返回的状态码。
断网时的结果:
状态码 | 说明 | 详情 |
---|---|---|
100 | 继续 | 请求者应当继续提出请求。服务器已收到请求的一部分,正在等待其余部分。 |
101 | 切换协议 | 请求者已要求服务器切换协议,服务器已确认并准备切换。 |
200 | 成功 | 服务器已成功处理了请求。 |
201 | 已创建 | 请求成功并且服务器创建了新的资源。 |
202 | 已接受 | 服务器已接受请求,但尚未处理。 |
203 | 非授权信息 | 服务器已成功处理了请求,但返回的信息可能来自另一个来源。 |
204 | 无内容 | 服务器成功处理了请求,但没有返回任何内容。 |
205 | 重置内容 | 服务器成功处理了请求,内容被重置。 |
206 | 部分内容 | 服务器成功处理了部分请求。 |
300 | 多种选择 | 针对请求,服务器可执行多种操作。 |
301 | 永久移动 | 请求的网页已永久移动到新位置,即永久重定向。 |
302 | 临时移动 | 请求的网页暂时跳转到其他页面,即暂时重定向。 |
303 | 查看其他位置 | 如果原来的请求是POST,重定向目标文档应该通过GET提取。 |
304 | 未修改 | 此次请求返回的网页未修改,继续使用上次的资源。 |
305 | 使用代理 | 请求者应该使用代理访问该网页。 |
307 | 临时重定向 | 请求的资源临时从其他位置相应。 |
400 | 错误请求 | 服务器无法解析该请求。 |
401 | 未授权 | 请求没有进行身份验证或验证未通过。 |
403 | 禁止访问 | 服务器拒绝此请求。 |
404 | 未找到 | 服务器找不到请求的网页。 |
405 | 方法禁用 | 服务器禁用了请求中指定的方法。 |
406 | 不接受 | 无法使用请求的内容响应请求的网页。 |
407 | 需要代理授权 | 请求者需要使用代理授权。 |
408 | 请求超时 | 服务器请求超时。 |
409 | 冲突 | 服务器在完成请求时发生冲突。 |
410 | 已删除 | 请求的资源已永久删除。 |
411 | 需要有效长度 | 服务器不接受不含有效内容长度标头字段的请求。 |
412 | 为满足前提条件 | 服务器未满足请求者在请求中设置的其中一个前提条件。 |
413 | 请求实体过大 | 请求实体过大,超出服务器的处理能力。 |
414 | 请求URI过长 | 请求网址过长,服务器无法处理。 |
415 | 不支持类型 | 请求的格式不受请求页面的支持。 |
416 | 请求范围不符 | 页面无法提供请求的范围。 |
417 | 未满足期望值 | 服务器未满足期望请求标头字段的要求。 |
500 | 服务器内部错误 | 服务器遇到错误,无法完成请求。 |
501 | 未实现 | 服务器不具备完成请求的功能。 |
502 | 错误网关 | 服务器作为网关或代理,从上游服务器收到无效响应。 |
503 | 服务不可用 | 服务器目前无法使用。 |
504 | 网关超时 | 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 |
505 | HTTP版本不支持 | 服务器不支持请求中所用的 HTTP 协议版本。 |
3.了解什么是请求头,如何添加请求头。
请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent等,下面将一些常用的头信息说明如下:
- Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language:指定客户端可接受的语言类型。
- Accept-Encoding:指定客户端可接受的内容编码。
- Host:用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置。从 HTTP 1.1 版本开始,Request 必须包含此内容。
- Cookie:也常用复数形式 Cookies,是网站为了辨别用户进行 Session 跟踪而储存在用户本地的数据。Cookies 的主要功能就是维持当前访问会话,例如我们输入用户名密码登录了某个网站,登录成功之后服务器会用 Session 保存我们的登录状态信息,后面我们每次刷新或请求该站点的其他页面时会发现都是保持着登录状态的,在这里就是 Cookies 的功劳,Cookies 里有信息标识了我们所对应的服务器的 Session 会话,每次浏览器在请求该站点的页面时都会在请求头中加上 Cookies 并将其发送给服务器,服务器通过 Cookies 识别出是我们自己,并且查出当前状态是登录的状态,所以返回的结果就是登录之后才能看到的网页内容。
- Referer,此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、做防盗链处理等。
- User-Agent,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息可以伪装为浏览器,如果不加很可能会被识别出为爬虫。
- Content-Type,即 Internet Media Type,互联网媒体类型,也叫做 MIME 类型,在 HTTP 协议消息头中,使用它来表示具体请求中的媒体类型信息。
'''
添加请求头
'''
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
response = requests.get(url, headers=HEADERS)
4.学习什么是正则表达式并尝试一些正则表达式并进行匹配。
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式测试工具:http://tool.oschina.net/regex/
匹配规则:
模式 | 描述 |
---|---|
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9] |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符 |
[… | ] |
[^…] | 不在 [] 中的字符:abc 匹配除了 a,b,c 之外的字符。 |
* | 匹配 0 个或多个的表达式。 |
+ | 匹配 1 个或多个的表达式。 |
? | 匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精确匹配 n 个前面表达式。 |
{n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a b | 匹配 a 或 b |
( ) | 匹配括号内的表达式,也表示一个组 |
Python中使用正则表达式要import re
# 导入正则表达式的re库
import re
5.结合requests、re两者的内容爬取https://movie.douban.com/top250里的内容。6.要求抓取名次、影片名称、国家、导演等字段。
第一页的网址:
第二页网址:
不难看出规律:start等于0+(页码-1)*25
我们写2个函数,一个get_html(url):通过url获取网页信息,一个get_info(html):通过网页信息,利用正则表达式来筛选出想要的信息。
第一步导包:
import requests
import re
写第一个get_html(url)函数:
def get_html(url):
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
response = requests.get(url, headers=HEADERS)
response.encoding = 'utf-8'
if response.status_code == 200:
return response.text
return None
这是我们要筛选的信息,现在我们通过正则表达式进行筛选。
第二个def get_info(html)函数:
def get_info(html):
pattern = re.compile(
r'<li.*?<em class="">(.*?)</em>.*?<span.*?title">(.*?)</span>.*?<p.*?>.*?导演: (.*?); (.*?)<br>(.*?) / (.*?) / (.*?)</p>.*?</li>',
re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'index': item[0],
'movie_name': item[1],
'country': item[5],
'director': item[2]
}
再写主函数:
if __name__ == '__main__':
for i in range(10):
url = 'https://movie.douban.com/top250?start=%d&filter=' % (i*25)
html = get_html(url)
for item in get_info(html):
print(item)
全部代码:
import requests
import re
def get_html(url):
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
response = requests.get(url, headers=HEADERS)
response.encoding = 'utf-8'
if response.status_code == 200:
return response.text
return None
def get_info(html):
pattern = re.compile(
r'<li.*?<em class="">(.*?)</em>.*?<span.*?title">(.*?)</span>.*?<p.*?>.*?导演: (.*?); (.*?)<br>(.*?) / (.*?) / (.*?)</p>.*?</li>',
re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'index': item[0],
'movie_name': item[1],
'country': item[5],
'director': item[2]
}
if __name__ == '__main__':
for i in range(10):
url = 'https://movie.douban.com/top250?start=%d&filter=' % (i*25)
html = get_html(url)
for item in get_info(html):
print(item)