1. Python3 使用urllib库请求网络

1.1 基于urllib库的GET请求

请求百度首页www.baidu.com ,不添加请求头信息:

 import urllib.requests

 def get_page():
5   url = 'http://www.baidu.com/'
  res = urllib.request.urlopen(url=url)
  page_source = res.read().decode('utf-8')
  print(page_source) if __name__ == '__main__':
  get_page()

输出显示百度首页的源码。但是有的网站进行了反爬虫设置,上述代码可能会返回一个40X之类的响应码,因为该网站识别出了是爬虫在访问网站,这时需要伪装一下爬虫,让爬虫模拟用户行为,给爬虫设置headers(User-Agent)属性,模拟浏览器请求网站。

1.2 使用User-Agent伪装后请求网站

由于urllib.request.urlopen() 函数不接受headers参数,所以需要构建一个urllib.request.Request对象来实现请求头的设置:

 import urllib.request

 def get_page():
5   url = 'http://www.baidu.com'
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  }
9   request = urllib.request.Request(url=url, headers=headers)
  res = urllib.request.urlopen(request)
11   page_source = res.read().decode('utf-8')
  print(page_source) if __name__ == '__main__':
  get_page()

添加headers参数,来模拟浏览器的行为。

1.3 基于urllib库的POST请求,并用Cookie保持会话

登陆ChinaUnix论坛,获取首页源码,然后访问一个文章。首先不使用Cookie看一下什么效果:

 import urllib.request
import urllib.parse def get_page():
  url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
7   headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  }
  data = {
    'username': 'StrivePy',
    'password': 'XXX'
  }
  postdata = urllib.parse.urlencode(data).encode('utf-8')
  req = urllib.request.Request(url=url, data=postdata, headers=headers)
  res = urllib.request.urlopen(req)
  page_source = res.read().decode('gbk')
18   print(page_source)   url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  res1 = urllib.request.urlopen(url=url1)
  page_source1 = res1.read().decode('gbk')
  print(page_source1) if __name__ == '__main__':
  get_page()

搜索源码中是否能看见用户名StrivePy,发现登陆成功,但是再请求其它文章时,显示为游客状态,会话状态没有保持。现在使用Cookie看一下效果:

 import urllib.request
import urllib.parse
import http.cookiejar def get_page():
  url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  }
  data = {
    'username': 'StrivePy',
    'password': 'XXX'
  }
  postdata = urllib.parse.urlencode(data).encode('utf-8')
  req = urllib.request.Request(url=url, data=postdata, headers=headers)
  # 创建CookieJar对象
  cjar = http.cookiejar.CookieJar()
  # 以CookieJar对象为参数创建Cookie
  cookie = urllib.request.HTTPCookieProcessor(cjar)
  # 以Cookie对象为参数创建Opener对象
  opener = urllib.request.build_opener(cookie)
23   # 将Opener安装位全局,覆盖urlopen函数,也可以临时使用opener.open()函数
24   urllib.request.install_opener(opener)
  res = urllib.request.urlopen(req)
  page_source = res.read().decode('gbk')
  print(page_source)   url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  res1 = urllib.request.urlopen(url=url1)
  page_source1 = res1.read().decode('gbk')
  print(page_source1) if __name__ == '__main__':
  get_page()

结果显示登陆成功后,再访问其它文章时,显示为登陆状态。若要将Cookie保存为文件待下次使用,可以使用MozillaCookieJar对象将Cookie保存为文件。

 import urllib.request
import urllib.parse
import http.cookiejar def get_page():
url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
}
data = {
'username': 'StrivePy',
'password': 'XXX'
}
postdata = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url=url, data=postdata, headers=headers)
filename = 'cookies.txt'
# 创建CookieJar对象
cjar = http.cookiejar.MozillaCookieJar(filename)
# 以CookieJar对象为参数创建Cookie
cookie = urllib.request.HTTPCookieProcessor(cjar)
# 以Cookie对象为参数创建Opener对象
opener = urllib.request.build_opener(cookie)
# 临时使用opener来请求
opener.open(req)
# 将cookie保存为文件
cjar.save(ignore_discard=True, ignore_expires=True)

会在当前工作目录生成一个名为cookies.txtcookie文件,下次就可以不用登陆(如果cookie没有失效的话)直接读取这个文件来实现免登录访问。例如不进行登陆直接访问其中一篇文章(没登陆也可以访问,主要是看抬头是不是登陆状态):

 import http.cookiejar

 def get_page():
url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
filename = 'cookies.txt'
cjar = http.cookiejar.MozillaCookieJar(filename)
cjar.load(ignore_discard=True, ignore_expires=True)
cookie = urllib.request.HTTPCookieProcessor(cjar)
opener = urllib.request.build_opener(cookie)
res1 = opener.open(url1)
page_source1 = res1.read().decode('gbk')
print(page_source1) if __name__ == '__main__':
get_page()

结果显示是以登陆状态在查看这篇文章。

1.4 基于urllib库使用代理请求

使用代理可以有效规避爬虫被封。

 import urllib.request

 def proxy_test():
url = 'http://myip.kkcha.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
proxy = {
'http': '180.137.232.101:53281'
}
# 创建代理Handler对象
proxy_handler = urllib.request.ProxyHandler(proxy)
# 以Handler对象为参数创建Opener对象
opener = urllib.request.build_opener(proxy_handler)
# 将Opener安装为全局
urllib.request.install_opener(opener)
response = urllib.request.urlopen(request)
page_source = response.read().decode('utf-8')
print(page_source) if __name__ == '__main__':
proxy_test()

抓取到的页面应该显示代理IP,不知道什么原因,有时候能正常显示,有时候跳转到有道词典广告页!!!问题有待更进一步研究。

2. Python3 使用requsets库访问网络

2.1 基于requests库的GET请求

GET方式请求http://httpbin.org测试网站。

 import requests

 def request_test():
url = 'http://httpbin.org/get'
response = requests.get(url)
print(type(response.text), response.text)
print(type(response.content), response.content) if __name__ == '__main__':
request_test()

直接得到响应体。

 <class 'str'> {"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"121.61.132.191","url":"http://httpbin.org/get"}

 <class 'bytes'> b'{"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"121.61.132.191","url":"http://httpbin.org/get"}\n

GET方法中传递参数的三种方式:

  • 将字典形式的参数用urllib.parse.urlencode()函数编码成url参数:

     import urllib.parse
    
     if __name__ == '__main__':
    base_url = 'http://httpbin.org/'
    params = {
    'key1': 'value1',
    'key2': 'value2'
    }
    full_url = base_url + urllib.parse.urlencode(params)
    print(full_url)
     http://httpbin.org/key1=value1&key2=value2
  • 直接在urllib.request.get()函数中使用params参数:
     import requests
    
     if __name__ == '__main__':
    payload = {
    'key1': 'value1',
    'key2': 'value2'
    }
    response = requests.get('http://httpbin.org/get', params=payload)
    print(response.url)
     http://httpbin.org/key1=value1&key2=value2
  • url直接包含参数:
     http://httpbin.org/get?key2=value2&key1=value1

2.2 基于requests库的POST请求,并用session保持会话

登陆ChinaUnix论坛,获取首页源码,然后访问一个文章。首先不使用Session看一下什么效果:

 import requests

 def get_page():
6   url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  }
  data = {
11     'username': 'StrivePy',
    'password': 'XXX'
  }
  response = requests.post(url=url, data=data, headers=headers)
  page_source = response.text
  print(response.status_code)
  print(page_source)   url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  response1 = requests.get(url=url1, headers=headers)
  page_source1 = response1.text
  print(response1.status_code)
  print(page_source1) if __name__ == '__main__':
  get_page()

结果显示访问其它文章时为游客模式。接下来用session来维持会话看一下效果:

 import requests

 def get_page():
  url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  }
  data = {
    'username': 'StrivePy',
    'password': 'XXX'
  }
  session = requests.session()
  response = session.post(url=url, data=data, headers=headers)
  page_source = response.text
  print(response.status_code)
  print(page_source)   url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  response1 = session.get(url=url1, headers=headers)
  page_source1 = response1.text
22   print(response1.status_code)
  print(page_source1) if __name__ == '__main__':
  get_page()

结果显示访问其它文章时,显示为登陆状态,会话保持住了。使用session的效果类似于urllib库临时使用opener或者将opener安装为全局的效果。

2.3 基于requests库使用代理请求

在requests库中使用代理:

 import requests

 def proxy_test():
url = 'http://myip.kkcha.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
}
proxy = {
'https': '61.135.217.7: 80'
}
response = requests.get(url=url, headers=headers, proxies=proxy)
print(response.text) if __name__ == '__main__':
proxy_test()

这个请求到的代码显示IP还是本地的网络IP,代理没起作用,具体原因有待研究。

最新文章

  1. third class
  2. rabbitmq安装
  3. es2自动发现插件
  4. Linux电源管理(11)_Runtime PM之功能描述
  5. CSS知识点补充
  6. HTML调用servlet(二)
  7. 慢慢聊Linux AIO
  8. SPOJ LCS2 后缀自动机
  9. [解决]ASP.NET MVC 4/5 源码调试(source code debug)
  10. C语言/C++中怎样产生随机数
  11. ios策略模式应用
  12. fragment的入门DEMO
  13. 转载 python实例手册
  14. G - Surf Gym - 100819S -逆向背包DP
  15. 强大的原生DOM选择器querySelector和querySelectorAll
  16. bzoj2208 连通数(bitset优化传递闭包)
  17. 牛客 Wannafly 挑战赛26D 禁书目录 排列组合 概率期望
  18. 5个python爬虫教材,让小白也有爬虫可写,含视频教程!
  19. IDEA 导出项目war包
  20. java多线程与并发笔记

热门文章

  1. leetcode937
  2. c++builder 6 远程调试
  3. mysql闯关练习
  4. 使用JS获取当前地理位置方法汇总
  5. box2d 计算下一帧的位置/角度
  6. 常用类一一MATH类一一两个静态常量PI 和E,一些数学函数。
  7. mysql 导出sql结果成csv文件
  8. 解决Lightmap在PC上与ios和Android上表现不同的问题
  9. SVN服务器的安装和使用
  10. 关于Python的OSError和IOError