当前位置:   article > 正文

Day:003 | Python爬虫:高效数据抓取的编程技术(爬虫基础)

Day:003 | Python爬虫:高效数据抓取的编程技术(爬虫基础)

urllib发送get请求

        在目前网络获取数据的方式有多种方式:GET方式大部分被传输到浏览器的html,images,

js,css, … 都是通过GET

方法发出请求的。它是获取数据的主要方法

例如:www.baidu.com 搜索

Get请求的参数都是在Url中体现的,如果有中文,需要转码,这时我们可使用

urllib.parse. quote

  1. from urllib.request import urlopen,Request
  2. from urllib.parse import quote
  3. args =input('请输入要搜索的内容:')
  4. ua = UserAgent()
  5. url = f'https://www.baidu.com/s?wd={quote(args)}'
  6. headers = {
  7.    'User-Agent':'Mozilla/5.0 (Windows NT
  8. 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
  9. like Gecko) Chrome/101.0.4951.64
  10. Safari/537.36 Edg/101.0.1210.47'
  11. }
  12. req = Request(url,headers = headers)
  13. resp = urlopen(req)
  14. print(resp.read().decode())

urllib.parse.urlencode

  1. from urllib.request import urlopen,Request
  2. from urllib.parse import urlencode
  3. args =input('请输入要搜索的内容:')
  4. parms ={
  5.    'wd':args
  6. }
  7. url = f'http://www.baidu.com/s?ie=utf8&f=8&rsv_bp=1&tn=baidu&{urlencode(parms)}'
  8. headers = {
  9.    'User-Agent':'Mozilla/5.0 (Windows NT
  10. 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
  11. like Gecko) Chrome/90.0.4430.212
  12. Safari/537.36'
  13. }
  14. req = Request(url,headers = header)
  15. resp = urlopen(req)
  16. print(resp.read().decode())

实战-喜马拉雅网站 

热门有声作品推荐_好听的音乐专辑在线收听 – 喜马拉雅 (ximalaya.com)icon-default.png?t=N7T8https://www.ximalaya.com/yinyue/

备注
了解如何分析URL地址,与构造URL参数的思路即可。使用别的
网站也可以测试,因为网站随时有可能会变

代码

  1. from urllib.request import Request,urlopen
  2. from time import sleep
  3. def spider_music(_type,page):
  4.    # 构造URL地址
  5.    for num in range(1,page+1):
  6.        if num == 1:
  7.            url =
  8. f'https://www.ximalaya.com/yinyue/{_type}'
  9.        else:
  10. url =
  11. f'https://www.ximalaya.com/yinyue/{_type}/p{num}/'
  12.        headers = {'User-Agent':'Mozilla/5.0
  13. (Windows NT 10.0; Win64; x64)
  14. AppleWebKit/537.36 (KHTML, like Gecko)
  15. Chrome/102.0.5005.63 Safari/537.36'}
  16.        # 构造请求对象
  17.        req = Request(url,headers=headers)
  18.        # 发送请求
  19.        resp = urlopen(req)
  20.        # 获取响应
  21.        print(resp.getcode())
  22.        print(resp.geturl())
  23.        # print(resp.read().decode()[:2000])
  24.        # 休眠
  25.        sleep(1)
  26.    
  27. if __name__ == '__main__':
  28.    spider_music('minyao',3)

urllib发送post请求 

在目前网络获取数据的方式有多种方式:POST

POST请求的参数需要放到Request请求对象中,data是一个字典,里面要匹配键值对

代码

  1. from urllib.request import Request,urlopen
  2. from urllib.parse import urlencode
  3. url = 'https://www.kuaidaili.com/login/'
  4. # 封装数据
  5. data = {
  6.    'next': '/login/?next=%2F',
  7.    'login_type': '1',
  8.    'username': '398707160@qq.com',
  9.    'passwd': '111111111',
  10. }
  11. tru_data = urlencode(data).encode()
  12. # 封装头信息
  13. headers = {'User-Agent':'Mozilla/5.0
  14. (Windows NT 10.0; Win64; x64)
  15. AppleWebKit/537.36 (KHTML, like Gecko)
  16. Chrome/102.0.5005.63 Safari/537.36'}
  17. # 封装Request对象
  18. req =
  19. Request(url,data=tru_data,headers=headers)
  20. # 发送请求
  21. resp = urlopen(req)
  22. # 打印结果
  23. print(resp.read().decode())

动态页面获取数据 

有时在访问了请求后,并不能获取想要的数据。很大的原因之一就是,当前的页面是动态的。目前

网络的页面分为2大类:

  • 静态页面

        特征:访问有UI页面URL,可以直接获取数据

  • 动态页面(AJAX)

        特征:访问有UI页面URL,不能获取数据。需要抓取新的请求获取数据

有些网页内容使用AJAX加载,而AJAX一般返回的是JSON,直接对AJAX地址进行post或get,就返

回JSON数据了

代码

  1. from urllib.request import Request,urlopen
  2. url ='https://www.hupu.com/home/v1/news?
  3. pageNo=2&pageSize=50'
  4. headers = {'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64)
  5. AppleWebKit/537.36 (KHTML, like Gecko)Chrome/90.0.4430.212 Safari/537.36'}
  6. req = Request(url,headers = headers)
  7. resp = urlopen(req)
  8. print(resp.read().decode())
  9. '''
  10. 静态
  11.   访问地址栏里的数据就可以获取到想要的数据。
  12. 动态
  13.   访问地址栏里的数据就可以获取不到想要的数据。
  14.   解决方案:抓包
  15.       打开浏览器的开发者工具-network-xhr,找到可
  16. 以获取到数据的url访问即可
  17. '''

请求 SSL证书验证

现在随处可见 https 开头的网站,urllib可以为 HTTPS 请求验证SSL证书,就像web浏览器一样,

如果网站的SSL证书是经过CA认证的,则能够正常访问,如:https://www.baidu.com/

如果SSL证书验证不通过,或者操作系统不信任服务器的安全证书,比如浏览器在访问12306网战

如:https://www.12306.cn/mormhweb/ 的时候,会警告用户证书不受信任。(据说 12306 网站证

书是自己做的,没有通过CA认证)

  1. import ssl
  2. # 忽略SSL安全认证
  3. context = ssl._create_unverified_context()
  4. # 添加到context参数里
  5. response = urlopen(request, context =
  6. context)

伪装自己的爬虫-请求头 

有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所

以为了完全模拟浏览器的工作

安装

pip install fake-useragent

代码

  1. from urllib.request import urlopen
  2. from urllib.request import Request
  3. from fake_useragent import UserAgent
  4. ua = UserAgent()
  5. url = 'http://httpbin.org/get'
  6. headers = {
  7.    'User-Agent':ua.chrome
  8. }
  9. req = Request(url,headers=headers)
  10. resp = urlopen(req)
  11. print(resp.read().decode())

注意
fake-useragent 在创建对象时,可能创建不了,多部分原因为服务器访问不到的原因
解决方案

拷贝fake-useragent_version.json 的配置文件到用户目录
C:\Users\Feel\AppData\Local\Temp

urllib的底层原理 

当你获取一个URL你使用一个opener(一个urllib.OpenerDirector的实例)。在前面,我们都是使用的

默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传

入的参数仅仅是url,data,timeout。

如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的

opener来实现对Cookie的设置

代码

  1. from urllib.request import
  2. Request,build_opener
  3. from fake_useragent import UserAgent
  4. url = 'http://httpbin.org/get'
  5. headers = {'User-Agent':UserAgent().chrome}
  6. req = Request(url,headers= headers)
  7. opener = build_opener()
  8. resp = opener.open(req)
  9. print(resp.read().decode())
  10. from urllib.request import
  11. Request,build_opener
  12. from fake_useragent import UserAgent
  13. from urllib.request import HTTPHandler
  14. url = 'http://httpbin.org/get'
  15. headers = {'User-Agent':UserAgent().chrome}
  16. req = Request(url,headers= headers)
  17. handler = HTTPHandler(debuglevel=1)
  18. opener = build_opener(handler)
  19. resp = opener.open(req)
  20. print(resp.read().decode())

伪装自己的爬虫-设置代理 

爬虫设置代理就是让别的服务器或电脑代替自己的服务器去获取数据

爬虫代理原理

代理分类

  • 透明代理:目标网站知道你使用了代理并且知道你的源IP地址,这种代理显然不符合我们这里使用

代理的初衷

  • 匿名代理:匿名程度比较低,也就是网站知道你使用了代理,但是并不知道你的源IP地址
  • 高匿代理:这是最保险的方式,目标网站既不知道你使用的代理更不知道你的源IP

代理网站

代理网站目前可用,但不一定稳定。

小象代理:https://www.xiaoxiangdaili.com/
快代理:https://www.kuaidaili.com
云代理:http://www.ip3366.net
66ip 代理:http://www.66ip.cn
站大爷:https://www.zdaye.com/
开心代理:http://ip.kxdaili.com/
讯代理:http://www.xdaili.cn/

注意

代理IP无论是免费,还是付费,都不能保证一定可用

  • 可能此IP已被其他人使用爬取同样的目标网站而被封禁
  • 代理服务器突然发生故障或网络繁忙

代码

  1. from urllib.request import
  2. build_opener,Request,ProxyHandler
  3. from fake_useragent import UserAgent
  4. url = 'http://httpbin.org/get'
  5. header = {'User-Agent':UserAgent().chrome}
  6. req = Request(url,headers=header)
  7. # 构建一个可以使用代理的控制器
  8. # ProxyHandler({'type':'ip:port'})
  9. # handler =
  10. ProxyHandler({'http':'122.9.101.6:8888'})
  11. handler =
  12. ProxyHandler({'http':'http://398707160:j8inh
  13. g2g@162.14.117.8:16816'})
  14. # 构建一个opener对象
  15. opener = build_opener(handler)
  16. # 发送请求
  17. resp = opener.open(req)
  18. # 打印结果
  19. print(resp.read().decode())

爬虫cookie的使用 

网络部分信息或APP的信息,若是想获取数据时,需要提前做一些操作,往往是需要登录,或者题

前访问过某些页面才可以获取到!!

其实底层就是在网页里面增加了Cookie信息

代码

  1. from urllib.request import
  2. Request,build_opener
  3. from fake_useragent import UserAgent
  4. url
  5. ='https://www.kuaidaili.com/usercenter/overview'
  6. headers = {
  7.    'User-Agent':UserAgent().chrome,
  8.    'Cookie':'channelid=0;
  9. sid=1621786217815170;
  10. _ga=GA1.2.301996636.1621786363;
  11. _gid=GA1.2.699625050.1621786363;
  12. Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1621
  13. 786363,1621823311; _gat=1;
  14. Hm_lpvt_7ed65b1cc4b810e9fd37959c9bb51b31=162
  15. 1823382;
  16. sessionid=48cc80a5da3a451c2fa3ce682d29fde7'
  17. }
  18. req = Request(url,headers= headers)
  19. opener = build_opener()
  20. resp = opener.open(req)
  21. print(resp.read().decode())

代码登录-并保持登录状态 

问题
不想手动复制cookie,太繁琐了!
解决方案
在再代码中执行登录操作,并保持Cookie不丢失

 为了保持Cookie不丢失可以 urllib.request.HTTPCookieProcessor 来扩展opener的功能

代码

  1. from urllib.request import
  2. Request,build_opener
  3. from fake_useragent import UserAgent
  4. from urllib.parse import urlencode
  5. from urllib.request import
  6. HTTPCookieProcessor
  7. login_url
  8. ='https://www.kuaidaili.com/login/'
  9. args = {
  10.    'username':'398707160@qq.com',
  11.    'passwd':'123456abc'
  12. }
  13. headers = {
  14.    'User-Agent':UserAgent().chrome
  15. }
  16. req = Request(login_url,headers=
  17. headers,data = urlencode(args).encode())
  18. # 创建一个可以保存cookie的控制器对象
  19. handler = HTTPCookieProcessor()
  20. # 构造发送请求的对象
  21. opener = build_opener(handler)
  22. # 登录
  23. resp = opener.open(req)
  24. '''
  25. -------------------------上面已经登录好--------
  26. --------------------------
  27. '''
  28. index_url
  29. ='https://www.kuaidaili.com/usercenter/overv
  30. iew'
  31. index_req = Request(index_url,headers
  32. =headers)
  33. index_resp = opener.open(index_req)
  34. print(index_resp.read().decode())

爬虫保存与读取Cookie

原理

CookieJar

我们可以利用本模块的 http.cookiejar.CookieJar 类的对象来捕获cookie并在后续连接请求时重新发

送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar,

MozillaCookieJar、LWPCookieJar 

  1. from urllib.request import
  2. Request,build_opener,HTTPCookieProcessor
  3. from fake_useragent import UserAgent
  4. from urllib.parse import urlencode
  5. from http.cookiejar import MozillaCookieJar
  6. def get_cookie():
  7.    url = 'https://www.kuaidaili.com/login/'
  8.    args = {
  9.        'username':'398707160@qq.com',
  10.        'passwd':'123456abc'
  11.   }
  12.    headers = {'UserAgent':UserAgent().chrome}
  13.    req = Request(url,headers = headers,
  14. data = urlencode(args).encode())
  15.    cookie_jar = MozillaCookieJar()
  16.    handler =
  17. HTTPCookieProcessor(cookie_jar)
  18.    opener = build_opener(handler)
  19.    resp = opener.open(req)
  20.    # print(resp.read().decode())
  21.  
  22. cookie_jar.save('cookie.txt',ignore_discard
  23. =True,ignore_expires=True)
  24. def use_cookie():
  25.    url =
  26. 'https://www.kuaidaili.com/usercenter/'
  27.    headers = {'UserAgent':UserAgent().chrome}
  28.    req = Request(url,headers = headers)
  29.    cookie_jar = MozillaCookieJar()
  30.  
  31. cookie_jar.load('cookie.txt',ignore_discard
  32. =True,ignore_expires=True)
  33.    handler =
  34. HTTPCookieProcessor(cookie_jar)
  35.    opener = build_opener(handler)
  36.    resp = opener.open(req)
  37.    print(resp.read().decode())
  38. if __name__ == '__main__':
  39.    # get_cookie()
  40.    use_cookie()

urllib的异常处理 

错误类型

  • 服务器错误
  • 资源错误
  • 请求超时

#

代码

  1. from urllib.request import Request,urlopen
  2. from fake_useragent import UserAgent
  3. from urllib.error import URLError
  4. url =
  5. 'http://www.sxtwerwf1jojhofsaf.cn/sadfa/sdfs
  6. 14'
  7. headers = {'User-Agent':UserAgent().chrome}
  8. req = Request(url,headers = headers)
  9. try:
  10.  resp = urlopen(req)
  11.    print(resp.read().decode())
  12. except URLError as e:
  13.    # print(e)
  14.    if e.args:
  15.        print(e.args[0].errno)
  16.    else:
  17.        print(e.code)
  18. print('爬取完成')

requests模块-请求方式

这一节来简单介绍一下 requests 库的基本用法

安装

利用 pip 安装

 pip install requests

基本请求 

  1. req = requests.get("http://www.baidu.com")
  2. req = requests.post("http://www.baidu.com")
  3. req = requests.put("http://www.baidu.com")
  4. req = requests.delete("http://www.baidu.com")
  5. req = requests.head("http://www.baidu.com")
  6. req =requests.options("http://www.baidu.com")

 get请求

参数是字典,我们也可以传递json类型的参数:

  1. import requests
  2. from fake_useragent import UserAgent
  3. def test_get():
  4.    url = 'http://www.baidu.com/s'
  5.    headers = {'UserAgent':UserAgent().chrome}
  6.    # 构建传递的参数
  7.    params1 = {'wd':'python爬虫'}
  8.    # 发送请求
  9.    resp = requests.get(url,headers=
  10. headers,params=params1)
  11.    # 打印结果
  12.    print(resp.text[:1500])

post请求

参数是字典,我们也可以传递json类型的参数:

  1. import requests
  2. from fake_useragent import UserAgent
  3. def test_post():
  4.    url ='https://www.kuaidaili.com/login/'
  5.    headers = {'UserAgent':UserAgent().chrome}
  6.    # 构建传递的参数
  7.    data = {
  8.        'login_type': '1',
  9.        'username': '398707160@qq.com',
  10.        'passwd': '123456abc',
  11.        'next': '/'
  12.   }
  13.    # 发送请求
  14. resp =
  15. requests.post(url,headers=headers,data=data)
  16.    # 打印结果
  17.    print(resp.text[:1500])

requests伪装爬虫-详细使用 

自定义请求头部

伪装请求头部是采集时经常用的,我们可以用这个方法来隐藏
爬虫身份

  1. headers = {'User-Agent': 'python'}
  2. r = requests.get('http://www.zhidaow.com',
  3. headers = headers)
  4. print(r.request.headers['User-Agent'])

代理访问

采集时为避免被封IP,经常会使用代理。requests也有相应的
proxies属性 

 

  1. import requests
  2. proxies = {
  3.  "http": "http://10.10.1.10:3128",
  4.  "https": "https://10.10.1.10:1080",
  5. }
  6. requests.get("http://www.zhidaow.com",
  7. proxies=proxies)

requests其他功能

设置超时时间

可以通过timeout属性设置超时时间,一旦超过这个时间还没获
得响应内容,就会提示错误

  1. requests.get('http://github.com',
  2. timeout=0.001)

session自动保存cookies 

seesion的意思是保持一个会话,比如 登陆后继续操作(记录身
份信息) 而requests是单次请求的请求,身份信息不会被记录

 

  1. # 创建一个session对象
  2. s = requests.Session()
  3. # 用session对象发出get请求,设置cookies
  4. s.get('http://httpbin.org/cookies/set/session
  5. cookie/123456789')

ssl验证

  1. # 禁用安全请求警告
  2. requests.packages.urllib3.disable_warnings()
  3. resp = requests.get(url, verify=False,
  4. headers=headers)

获取响应信息

代码含义
resp.json()获取响应内容(以json字符串)
resp.text获取响应内容 (以字符串)
resp.content获取响应内容(以字节的方式)
resp.headers获取响应头内容
resp.url获取访问地址
resp.encoding获取网页编码
resp.request.headers请求头内容
resp.cookie获取cookie
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/391856
推荐阅读
相关标签
  

闽ICP备14008679号