爬虫学习task1
- http协议的get与post请求
get请求
1.get请求参数直接拼接url,且只能通过url编码
2.get请求能自动缓存
3.get请求可回退
4.get请求能完整地保留在浏览器的历史记录里
5.get请求产生的url可被当书签收藏
6.get请求传送的参数有长度限制
使用requests用get方法向https://www.baidu.com/发出一个请求,并将其返回结果输出。
使用urllib用get方法向https://www.baidu.com/发出一个请求,并将其返回结果输出。
post请求
1.post请求的参数是放在body体里,且支持多编码格式
2.get请求不能自动缓存
3.get请求不可回退,再形式请求
4.get请求不保留历史记录
5.get请求不能收藏
6.get请求传送的参数无长度限制
使用requests用post方法向https://www.baidu.com/发出一个请求,并将其返回结果输出。
使用urllib方法
- 断开网络,发出申请
断网后,以requests为例,分别对get和post方法发出申请,均出现ConnectionError的提示错误。
连接出现问题。
请求头
告知被请求服务器需要传送的请求类型
Accept:浏览器可接受的MIME类型。
Accept-Encoding:浏览器能够进行解码的数据编码方式。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Host:初始URL中的主机和端口。
Connection:表示是否需要持久连接。
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
Cookie:这是最重要的请求头信息之一。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
…
如何添加请求头?
在爬虫的时候,如果不添加请求头,可能网站会阻止一个用户的登陆,此时我们就需要添加请求头来进行模拟伪装,使用python添加请求头方法如下。
- 正则表达式
正则表达式是一种文本模式,通过正则表达式可以检索出类似规则(或模式)的匹配文本。
尝试一些正则表达式并进行匹配(https://regexr.com/)
寻找T开头后面为一个未知字符的文本
T(\w)?
在此文本中检索出了3个,分别是Te,Th,To
寻找所有像空格、换行符等+&的文本
\s+&
找到了3处类似文本
正则表达式调用re模块
re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。函数语法:re.match(pattern, string, flags=0)。
pattern: 匹配的正则表达式
string: 要匹配的字符串
flags: 标志位,用于控制正则表达式的匹配方式
我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。
group(num=0): 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups(): 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
1.group(num=0): 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
2.groups(): 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
其中span()函数span() 返回一个元组包含匹配 (开始,结束) 的位置。
re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配。函数语法:re.search(pattern, string, flags=0),参数含义与match函数的相同。
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
检索与替换
sub(repl, string[, count]) |
re.sub(pattern, repl, string,count,flag):
使用repl替换string中每一个匹配的子串后返回替换后的字符串。
当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0。
当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
repl参数一个函数
记住要加?号,否则没有命名成功为group:
re.compile(strPattern[, flag])
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符’|‘表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile(‘pattern’, re.I | re.M)与re.compile(’(?im)pattern’)是等价的。 可选值有:
• re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
• M(MULTILINE): 多行模式,改变’^‘和’$‘的行为(参见上图)
• S(DOTALL): 点任意匹配模式,改变’.'的行为
• L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
• U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
• X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
re.findall函数
搜索string,以列表的形式返回全部能匹配的子串。如果没有找到匹配的,则返回空列表。语法格式为:findall(string, pos, endpos)
- 作业
结合requests、re两者的内容爬取https://movie.douban.com/top250里的内容
要求抓取名次、影片名称、年份、导演等字段