• python爬虫(1)


     目录

    一,第一个爬虫程序

    二,response对象的一些方法

    1,使用getcode()方法获取响应报文的状态码

    2,使用geturl()方法获取爬取的网址名称

    3,使用info()方法获取响应报文头信息

    三,Request对象

    四,GET请求时添加参数(以百度搜索为例)


    一,第一个爬虫程序

            urllib是一个python内置包,urllib里面的request模块用于http请求。urlopen()是request模块里面的一个方法。

            urlopen方法默认使用GET方式请求数据,返回结果是一个对象。

            res.read()方法将响应的报文内容(响应主体信息)进行解码得到一个byte对象。

            一般爬虫爬取得到的是前端程序员希望展示给我们看的内容,也就是html文本文件。下面的代码就是简单爬取百度。

    1. from urllib.request import urlopen
    2. res: object = urlopen(url='http://www.baidu.com/')
    3. print(res.read().decode())

    二,response对象的一些方法

    1,使用getcode()方法获取响应报文的状态码

    1. print(re.getcode())
    2. # 200

            当我们爬取一个网址时根据返回的状态码识别是否有必要接着爬,如果爬取的网址存在异常则终止爬取。

    2,使用geturl()方法获取爬取的网址名称

    1. print(res.geturl())
    2. # http://www.baidu.com/

            获取网址名称是为了避免重复爬取同一个网址。

    3,使用info()方法获取响应报文头信息

    1. print(res.info())
    2. # Bdpagetype: 1
    3. # Bdqid: 0xa555928600017556
    4. # Content-Type: text/html; charset=utf-8
    5. # Date: Tue, 26 Jul 2022 05:48:48 GMT
    6. # P3p: CP=" OTI DSP COR IVA OUR IND COM "
    7. # P3p: CP=" OTI DSP COR IVA OUR IND COM "
    8. # Server: BWS/1.1
    9. # Set-Cookie: BAIDUID=0636:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=21647; path=/; domain=.baidu.com
    10. # Set-Cookie: BIDUPSID=063FDED22F3; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    11. # Set-Cookie: PSTM=165828; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=283647; path=/; domain=.baidu.com
    12. # Set-Cookie: BAIDUID=06377B:FG=1; max-age=3100; expires=Wed, 26-Jul-23 05:48:48 GMT; domain=.baidu.com; path=/; version=1; comment=bd
    13. # Set-Cookie: BDSVRTM=0; path=/
    14. # Set-Cookie: BD_HOME=1; path=/
    15. # Set-Cookie: H_PS_PSSID=36837_36543666166_36350_36866; path=/; domain=.baidu.com
    16. # Traceid: 1658814
    17. # Vary: Accept-Encoding
    18. # X-Frame-Options: sameorigin
    19. # X-Ua-Compatible: IE=Edge,chrome=1
    20. # Connection: close
    21. # Transfer-Encoding: chunked

    三,Request对象

            Request是模块request里面的一个类,这个类的作用就是封装一个http请求报文,包括http的请求头,请求行,请求体等,也就是header信息,包括User-Agent,Host,Connection,Accept等。

            请求报文的作用是应对被爬取网址的一些验证,可以将验证信息封装在请求报文之中,从而通过被爬取网址的验证。

    1. from urllib.request import Request, urlopen
    2. from random import choice
    3. User_Agent_dict = {
    4. 'iPad': 'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/4.0.2 '
    5. 'Mobile/8C148 Safari/6533.18.5',
    6. 'iPhone': "Mozilla/5.0 (iPhone; U; CPU OS 4_2_1 like Mac OS X) AppleWebKit/532.9 (KHTML, like Gecko) Version/5.0.3 "
    7. "Mobile/8B5097d Safari/6531.22.7 ",
    8. 'default': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 '
    9. 'Safari/537.36 '
    10. }
    11. user_agent_list = ['iPad', 'iPhone', 'default']
    12. ua = User_Agent_dict[choice(user_agent_list)]
    13. req = Request(url='http://httpbin.org/get', headers={'User-Agent': ua})
    14. resp = urlopen(req)
    15. print(resp.getcode())
    16. print(resp.read().decode('utf-8'))

            也可以使用pip install fake-useragent安装fake-useragent模块,动态生成各种不同的ua。

    1. from fake_useragent import UserAgent
    2. re1 = UserAgent()
    3. print(re1.ie)
    4. print(re1.random)

    四,GET请求时添加参数(以百度搜索为例)

            如下图,百度搜索时的参数写在百度域名后边,以?开头,以key:value的形式添加,如wd=常见的UA。

            使用GET方式发送请求时,请求报文的主体信息就会在网址后面以?key1:value1&key2:value2&key3:value3……的形式添加。

            但是url存在自己的规范,url中反斜杠\等特殊字符会引起不必要的错误,所以应该将可能带来错误的字符串参数进行转码。比如将字符串'\n我爱你'进行转码得到%5Cn%E6%88%91%E7%88%B1%E4%BD%A0。当出现中文时一般要转码。

            两个转码方法:from urllib.parse import urlencode的urlencode方法,参数是一个字典,会将字典的键和值直接进行拼接,并将每一个参数使用&连接。

            其二,from urllib.parse import quote的quote方法,直接将一个字符串转码成url中使用的字符。

    1. from urllib.request import Request, urlopen
    2. from urllib.parse import quote # 将字符串参数进行转码,从而得到一个规范的url地址
    3. from fake_useragent import UserAgent
    4. ua = UserAgent().random
    5. wd = quote(r'\n我爱你')
    6. print(wd)
    7. url = 'https://www.baidu.com/s?wd={keyword}'.format(keyword=wd)
    8. req = Request(url=url, headers={'User-Agent': ua})
    9. resp = urlopen(req)
    10. print(resp.getcode())
    11. print(resp.read().decode())
    12. print(resp.info())

            下面的代码用于接收搜索关键字并百度搜索这个关键字。

    1. from urllib.request import Request, urlopen
    2. from urllib.parse import urlencode # 将字符串参数进行转码,从而得到一个规范的url地址
    3. from fake_useragent import UserAgent
    4. ua = UserAgent().chrome
    5. args = input('请输入搜索内容')
    6. keyw = {
    7. 'wd': args,
    8. 'ie': 'utf-8'
    9. }
    10. paras = urlencode(keyw)
    11. url = 'https://www.baidu.com/s?{0}'.format(paras)
    12. req = Request(url=url, headers={'User-Agent': ua})
    13. resp = urlopen(req)
    14. print(resp.getcode())
    15. print(resp.read().decode())
    16. print(resp.info())
  • 相关阅读:
    软件代码设计-小优化(四)
    第三章 搜索与图论(三)
    【信号处理】Matlab实现语音变速变调
    尚硅谷Java数据结构--希尔排序
    大学毕业后,我就送了2个月外卖,哭了一整晚
    echarts疑难杂症
    React报错之Parameter 'props' implicitly has an 'any' type
    vscode OpenCV环境搭建
    SparkMlib 之随机森林及其案例
    mysql中find_in_set()函数的使用及in()用法详解
  • 原文地址:https://blog.csdn.net/weixin_44992737/article/details/125992889