博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python网络爬虫(requests, 代理,Web认证, SSL证书认证)
阅读量:6211 次
发布时间:2019-06-21

本文共 6929 字,大约阅读时间需要 23 分钟。

requests模块
    代理(proxies)
        西刺代理
        快代理
        全网代理
        高匿ip:看不到真实ip
        透明ip:可以看到代理 和 真实ip
    普通代理
        proxies = {"协议":"协议://IP地址:端口号"}
'''01_普通代理示例.py'''import requestsurl = "http://www.baidu.com/"proxies = {"http":"http://183.129.207.82:11597"}headers = {"User-Agent":"Mozilla/5.0"}res = requests.get(url,proxies=proxies,headers=headers)print(res.status_code)
    私密代理
        proxies = {"协议": "协议://用户名:密码@ip地址:端口号"}
'''02_私密代理示例.py'''import requestsurl = "http://httpbin.org/get"headers = {"User-Agent":"Mozilla/5.0"}proxies = {"http":"http://309435365:szayclhp@123.206.119.108:16817"}res = requests.get(url,proxies=proxies,headers=headers)res.encoding = "utf-8"print(res.text)
爬取链家二手房信息 --> 存到MySQL数据库中
'''05_链家数据ToMongo.py'''import requestsimport reimport pymysqlimport warningsclass LianjiaSpider:    def __init__(self):        self.baseurl = "https://bj.lianjia.com/ershoufang/pg"        self.page = 1        self.headers = {"User-Agent": "Mozilla/5.0"}        self.proxies = {"http": "http://127.0.0.1:8888"}        self.db = pymysql.connect("localhost",                  "root","ParisPython",charset="utf8")        self.cursor = self.db.cursor()    def getPage(self,url):        res = requests.get(url,proxies=self.proxies,headers=self.headers,timeout=5)        res.encoding = "utf-8"        html = res.text        print("页面爬取成功,正在解析...")        self.parsePage(html)    def parsePage(self,html):        p = re.compile('
(.*?).*?
.*?
(.*?)(.*?)
',re.S) r_list = p.findall(html) # [("天通苑","480","万"),()..] print("页面解析完成,正在存入数据库...") self.writeTomysql(r_list) def writeTomysql(self,r_list): c_db = "create database if not exists Lianjiadb \ character set utf8" u_db = "use Lianjiadb" c_tab = "create table if not exists housePrice( \ id int primary key auto_increment,\ housename varchar(50), \ totalprice int)charset=utf8" warnings.filterwarnings("ignore") try: self.cursor.execute(c_db) self.cursor.execute(u_db) self.cursor.execute(c_tab) except Warning: pass ins = "insert into housePrice(housename,totalprice) \ values(%s,%s)" for r_tuple in r_list: name = r_tuple[0].strip() price = float(r_tuple[1].strip())*10000 L = [name,price] self.cursor.execute(ins,L) self.db.commit() print("存入数据库成功") def workOn(self): while True: c = input("爬取按y(q退出):") if c.strip().lower() == "y": url = self.baseurl + str(self.page) + "/" self.getPage(url) self.page += 1 else: self.cursor.close() self.db.close() print("爬取结束,谢谢使用!") breakif __name__ == "__main__": spider = LianjiaSpider() spider.workOn()
    找URL
      https://bj.lianjia.com/ershoufang/pg1/
    正则
<div class="houseInfo".*?data-el="region">(.*?)</a>.*?<div="totalPrice">.*?<span>(.*?)</span>(.*?)</div>
  Web客户端验证(参数名:auth)
    auth=("用户名","密码")
    案例 :09_Web客户端验证.py
'''09_Web客户端验证.py'''import requestsimport reclass NoteSpider:    def __init__(self):        self.headers = {"User-Agent":"Mozilla/5.0"}        self.url = "网址"        self.proxies = {"http":"http://309435365:szayclhp@123.206.119.108:16817"}        # auth参数存储用户名和密码(必须为元组)        self.auth = ("账号","密码")        def getParsePage(self):        res = requests.get(self.url,                           proxies=self.proxies,                           headers=self.headers,                           auth=self.auth,                           timeout=3)        res.encoding = "utf-8"        html = res.text        print(html)        p = re.compile('
  SSL证书认证(参数名:verify)
    verify = True : 默认,进行SSL证书认证
    verify = False: 不做认证
'''10_SSL证书认证示例.py'''import requestsurl = "https://www.12306.cn/mormhweb/"headers = {"User-Agent":"Mozilla/5.0"}res = requests.get(url,headers=headers,verify=False)res.encoding = "utf-8"print(res.text)
urllib.request中Handler处理器
  定义
    自定义的urlopen()方法,urlopen()方法是一个特殊的opener(模块已定义好),
    不支持代理等功能,通过Handler处理器对象来自定义opener对象
  常用方法
    build_opener(Handler处理器对象) :创建opener对象
    opener.open(url,参数)
# 创建Handler处理器对象http_handler = urllib.request.HTTPHandler()#proxy_handler = urllib.request.ProxyHandler()# 创建自定义的opener对象opener = urllib.request.build_opener(http_handler)# 利用opener对象的open()方法发请求req = urllib.request.Request(url)res = opener.open(req)print(res.read().decode("utf-8"))
  Handler处理器分类
    HTTPHandler() :没有任何特殊功能
    ProxyHandler(普通代理)
      代理: {"协议":"IP地址:端口号"}
    ProxyBasicAuthHandler(密码管理器对象) :私密代理
    HTTPBasicAuthHandler(密码管理器对象) : web客户端认证
    密码管理器对象作用
      私密代理
      Web客户端认证
      程序实现流程
        创建密码管理器对象
  pwdmg = urllib.request.HTTPPasswordMgrWithDefaultRealm()
把认证信息添加到密码管理器对象
  pwdmg.add_password(None,webserver,user,passwd)
创建Handler处理器对象
  私密代理
    proxy = urllib.request.ProxyAuthBasicHandler(pwdmg)
  Web客户端
    webbasic = urllib.request.HTTPBasicAuthHandler(pwdmg)
# 创建Handler处理器对象pro_hand = urllib.request.ProxyHandler(proxy)# 创建自定义opener对象opener = urllib.request.build_opener(pro_hand)# opener对象open方法发请求req = urllib.request.Request(url)res = opener.open(req)print(res.read().decode("utf-8"))
爬取猫眼电影排行榜存入MongoDB数据库
'''06_猫眼电影top100抓取.py'''import requestsimport reimport pymongoclass MaoyanSpider:    def __init__(self):        self.baseurl = "http://maoyan.com/board/4?offset="        self.headers = {"User-Agent":"Mozilla/5.0"}        self.page = 1        self.offset = 0        self.proxies = {"http":"http://309435365:szayclhp@123.206.119.108:16817"}        self.conn = pymongo.MongoClient("localhost",27017)        self.db = self.conn.Film        self.myset = self.db.top100            # 下载页面    def loadPage(self,url):        res = requests.get(url,headers=self.headers)        res.encoding = "utf-8"        html = res.text        self.parsePage(html)            # 解析页面    def parsePage(self,html):        p = re.compile('
.*?title="(.*?)".*?

(.*?)

.*?releasetime">(.*?)

',re.S) r_list = p.findall(html)# print(r_list) # [("霸王别姬","张国荣","1994-01-01"),(),()...] self.writeTomysql(r_list) def writeTomysql(self,r_list): for r_tuple in r_list: name = r_tuple[0].strip() star = r_tuple[1].strip() releasetime = r_tuple[2].strip() D = {"name":name, "star":star, "releasetime":releasetime} self.myset.insert(D) print("存入数据库成功") def workOn(self): while True: c = input("爬取请按y(y/n):") if c.strip().lower() == "y": self.offset = (self.page-1)*10 url = self.baseurl + str(self.offset) self.loadPage(url) self.page += 1 else: print("爬取结束,谢谢使用!") break if __name__ == "__main__": spider = MaoyanSpider() spider.workOn()

转载地址:http://bhdja.baihongyu.com/

你可能感兴趣的文章
基于moment写一个滑动日历
查看>>
移动端:对高度自适应的输入框说不~
查看>>
android开源新闻小程序、3D翻转公告效果、小说检索、Kotlin开发TODO清单等源码...
查看>>
PHP算法之判断是否是质数
查看>>
Android 系统开发_核心机制篇 -- 深入钻研 Handler(用法)
查看>>
promise学习(1)
查看>>
幂等的实现方案
查看>>
认识Java泛型
查看>>
node thread.sleep实现
查看>>
H5剪切板功能
查看>>
Spring Boot 参考指南(消息传递)
查看>>
如何在 Linux 上通过 C API 判断给定的 fd 的类型?
查看>>
Linux(CentOS)软件管理(2)- yum 在线安装
查看>>
重新定义数据库的时刻,阿里云数据库专家带你了解POLARDB
查看>>
【跃迁之路】【469天】刻意练习系列228(2018.05.20)
查看>>
如何修复UITextField在iOS10文字下沉问题
查看>>
一个简单的 laravel5 + vue 单页面博客
查看>>
前端进阶:二进制数据的操控----附项目代码
查看>>
阿里Java研发工程师实习面经,附面试技巧
查看>>
《深入理解Java虚拟机:JVM高级特性与最佳实践》第二章 Java内存区域与内存溢出异常 读书笔记...
查看>>