python爬虫笔记

余生颓废 提交于 2020-02-04 00:54:12

1.urllib库中request,parse的学习

1.1 简单的请求页面获取,并下载到本地 request的使用

from urllib import request

# 获取此网页的demout
resp = request.urlopen('http://www.baidu.com')

# 读出10个字符
# 结果为 b'<!DOCTYPE '  b代表bytes 是一个字节流
# '<!DOCTYPE ' 包括空格 正好十个字符
# print(resp.read(10))

# 读取一行
# 结果为 b'<!DOCTYPE html>\n'
# \n 代表换行
# ()里面可以写读几行
# print(resp.readline())

# 全部读取  二者对应的返回类型不同
# <class 'list'> readlines
# <class 'bytes'> read
# print(type(resp.readlines()))
# print(type(resp.read()))


# 下载到本地文件夹 
request.urlretrieve('http://www.baidu.com', 'baidu.html')

1.2 parse的使用

1.2.1 解决中文与码的对应问题

例:中文变成码 name=%E9%AB%98%E8%BE%BE 这些带%和中文之间的转换

 1 # 主要解决网址中中文是解析不了的问题
 2 
 3 from urllib import request
 4 from urllib import parse
 5 
 6 # 中文变成码 name=%E9%AB%98%E8%BE%BE&age=21
 7 
 8 # urlencode函数 把字典转化为字符串
 9 params = {'name': '高达', 'age': '21'}
10 result = parse.urlencode(params)
11 # 结果为
12 # <class 'str'>
13 # name=%E9%AB%98%E8%BE%BE&age=21
14 print(type(result))
15 print(result)
16 
17 # 如果直接在网址写中文会报错,虽然我们看到的是中文但是实际上是中文对应的码
18 # resp = request.urlopen('https://www.baidu.com/s?wd=刘德华')
19 
20 
21 # 写出一个字典
22 params = {'wd': '刘德华'}
23 print(params)
24 # 转化成正确的网站上的格式
25 qs = parse.urlencode(params)
26 print(qs)
27 # 这样请求就能成功
28 resp = request.urlopen('https://www.baidu.com/s?'+qs)
29 # print(resp.readlines())
30 # parse.parse_qs函数 还原解码
31 result = parse.parse_qs(qs)
32 # 结果为
33 # <class 'dict'>
34 # {'wd': ['刘德华']}
35 print(type(result))
36 print(result)

1.2.2 解析网址

# 解析网址
from urllib import parse


def test():
    # 测试用的 url
    url = 'http://www.baidu.com/s;sssas?wd=python&username=abc#1'
    url1 = 'http://www.baidu.com/s?wd=python&username=abc#1'
    url2 = 'https://api.bilibili.com/x/v2/reply?callback=jQuery17204184039578913048_1580701507886&jsonp=jsonp&pn=1&type=1&oid=70059391&sort=2&_=1580701510617'
    result1 = parse.urlparse(url)
    # <class 'urllib.parse.ParseResult'>
    print(type(result1))
    # 结果为 ParseResult(scheme='http', netloc='www.baidu.com', path='/s', params='sssas', query='wd=python&username=abc',
    # fragment='1')
    # print(result1)
    # print('scheme:', result1.scheme)
    # print('netloc:', result1.netloc)
    # print('path: ', result1.path)
    # print('params: ', result1.params)
    # print('query: ', result1.query)
    # print('fragment: ', result1.fragment)
    result2 = parse.urlsplit(url)
    print(result2)
    # urlparse函数与 urlsplit函数的对比
    # urlparse函数多一个params
    result1 = parse.urlparse(url1)
    result2 = parse.urlsplit(url1)
    print(result1)
    print(result2)
    # result3 = parse.urlparse(url2)
    # print('r3:', result3.query)


# 格式化输出函数
def myself_urlparse(url):
    result = parse.urlparse(url)
    print('scheme:', result.scheme)
    print('netloc:', result.netloc)
    print('path: ', result.path)
    print('params: ', result.params)
    print('query: ', result.query)
    print('fragment: ', result.fragment)


def myself_urlsplit(url):
    result = parse.urlsplit(url)
    print('scheme:', result.scheme)
    print('netloc:', result.netloc)
    print('path: ', result.path)
    print('query: ', result.query)
    print('fragment: ', result.fragment)


if __name__ == '__main__':
    test()

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!