Python爬虫第一次任务

任务预览(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网关超时服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505HTTP版本不支持服务器不支持请求中所用的 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.*?>.*?导演: (.*?);&nbsp;&nbsp;(.*?)<br>(.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;(.*?)</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.*?>.*?导演: (.*?);&nbsp;&nbsp;(.*?)<br>(.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;(.*?)</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)

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值