urllib
发起请求
url:设置目标url
data=None:默认为None,标识发起的是一个get请求,反之,不为None,表示发起的是一个post请求
timeout:设置请求的超时时间(s)
cafile=None,设置证书文件(一般不用)
capath=None,设置证书文件路径(一般不用)
context=None,一般设置为一个ssl的对象(ssl._create_unverified_context())
忽略未认证CA证书(如果出现了ssl证书错误)
opener
opener是urllib.request.OpenerDirector 的实例
我们经常使用urlopen方法内部其实就是自定义了opener
为什么要自定义opener:
因为urlopen方法比较有局限性,不能够实现一些高级的功能(使用代理,处理cookies),这是我们就需要自定义opener
handler:处理器,实例化一个handler的目的是为了完成特定的功能
获取响应的状态码:
XXXX.status
获取响应的响应头:
XXXX.getheaders()
获取某一个响应头参数
XXXX.getheader(‘参数名’)
获取当前请求的url地址
XXXX.url
获取请求的reason(如果成功返回的是OK)
XXXX.reason
注意:response.read()只可以读取一次
headers={}:设置请求头,传递一个字段类型的参数
爬虫代码基本步骤
1.分析网站,寻找目标url
2.分析目标url参数(get,post)
get请求参数部分:把?后面的参数写在字典中,然后使用parse.urlencode(字典参数),得到了url编码格式的字符串
post请求参数部分:是处理表单数据,将表单数据放在字典里,然后使用parse.urlencode(字典参数),得到了url编码格式的字符串,最后使用encode方法将字符串转为bytes类型
3.发起请求
a.设置请求头,添加UA(cookie,referer)
b.构建请求对象(实例化一个Request对象)(request.Request)
c.根据请求对象使用urlopen()方法发起请求
4.处理响应结果
a.Ajax请求得到的一般是json数据,使用json模块处理,使用json.loads将json字符串,转为python数据类型
b.对于非结构化数据(数据在html页面中),可以使用re正则提取数据(xpath,BeautifuSoup,pyquery)
c.如果还有其他url,则继续发起请求
5.数据持久化
a.文件存储(json,csv,txt…)
b.数据库存储(mysql,mongdb,redis)
正则
单字符匹配
. 除换行符之外的任意字符
\d 表示数字
\D 匹配非数字
\w 匹配单词字符[a-z,A-Z,0-9]
\W 匹配非单词字符
\s 匹配空白字符,空格,\n \t…
\S 匹配非空白字符
^ 匹配以…开头
$ 匹配以…结尾
[0-9] => \d 匹配0-9
多字符匹配(贪婪匹配)
- 匹配*前面的字符任意次数
- 匹配+前面的字符至少一次
?匹配?前面的字符0-1次
{n,m}匹配{n,m}前面的字符n-m次
多字符匹配(非贪婪匹配)
*?
+?
??
其他
()分组
|逻辑或
\转义字符
re模块下的方法
re.compile():构建正则表达式对象
re.match():从起始位开始匹配,单次匹配,如果匹配到结果立即返回,反之,返回None
re.search():在整个字符串中进行匹配,单次匹配,如果匹配到结果立即返回,反之,返回None
re.findall():匹配出整个字符串中,所有符合正则规则的结果,返回一个列表
re.finditer():匹配出整个字符串中,所有符合正则规则的结果,返回的是一个可迭代对象
re.sub():根据正则表达式进行字符串替换
re.split():根据正则表达式进行分割