【Python55--爬虫:代理】
一、反爬虫之隐藏
1、网站检查访问的是正常用户还是程序,关键在于User-Agent
1)、第一种方法:采用header
--修改header(两种方法):
--> 在Request之前通过headers参数修改
--> 在Request之后通过Request.add_header()修改
import urllib.request import urllib.parse import json import random import time import hashlib#用户输入翻译的内容 content = input('请输入需要翻译的内容:') #连接url地址 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'#第一种方法: #head = {} #head['User-Agent']='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36' #发送给服务器请求的数据 data = {} #此部分数据来源于:FromData data['i']= content data['from']= 'AUTO' data['to']= 'AUTO' data['smartresult']= 'dict' data['client']= 'fanyideskweb' data['salt']= '15439012305959' data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b' data['ts']= '1543901230595' data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5' data['doctype']= 'json' data['version']= '2.1' data['keyfrom']= 'fanyi.web' data['action']= 'FY_BY_CLICKBUTTION' data['typoResult']= 'false'#对数据进行编码处理 data = urllib.parse.urlencode(data).encode('utf-8') #创建一个request对象,把url和data传进去,并且使用POS请求 request = urllib.request.Request(url = url,data=data,method='POST')#第二种方法: request.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36')#打开请求 reponsend =urllib.request.urlopen(request) #读取返回来的数据 html = reponsend.read().decode('utf-8') #把返回来的json字符串解析成字典 line = json.loads(html) #print(line) #获取翻译结果 print('翻译的结果:%s'%(line['translateResult'][0][0]['tgt']))
2)、要想爬取很多内容,修改header就达不到这种效果了,就需要采用代理
-- 两种方法:
--> time.sleep() 方法 (效率低)
--> 使用代理
#time.sleep()方法import urllib.request import urllib.parse import json import random import time import hashlibwhile True:#用户输入翻译的内容content = input('请输入需要翻译的内容(输入q!退出程序):')if content=='q!':break#连接url地址url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'#发送给服务器请求的数据data = {}#此部分数据来源于:FromDatadata['i']= contentdata['from']= 'AUTO'data['to']= 'AUTO'data['smartresult']= 'dict'data['client']= 'fanyideskweb'data['salt']= '15439012305959'data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b'data['ts']= '1543901230595'data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5'data['doctype']= 'json'data['version']= '2.1'data['keyfrom']= 'fanyi.web'data['action']= 'FY_BY_CLICKBUTTION'data['typoResult']= 'false'#对数据进行编码处理data = urllib.parse.urlencode(data).encode('utf-8')#创建一个request对象,把url和data传进去,并且使用POS请求request = urllib.request.Request(url = url,data=data,method='POST')#打开请求reponsend =urllib.request.urlopen(request)#读取返回来的数据html = reponsend.read().decode('utf-8')#把返回来的json字符串解析成字典line = json.loads(html)#print(line)#获取翻译结果print('翻译的结果:%s'%(line['translateResult'][0][0]['tgt']))time.sleep(3)执行结果: 请输入需要翻译的内容(输入q!退出程序):爱国 翻译的结果:patriotic 请输入需要翻译的内容(输入q!退出程序):乘法 翻译的结果:The multiplication 请输入需要翻译的内容(输入q!退出程序):q! >>>
-->代理步骤:
1、参数是一个字典{'类型':'代理IP:端口号'}
proxy_support = urllib.request.ProxyHandler({})
2、定制、创建一个opener
opener = urllib.request.build_opener(proxy_support)
3a、安装opener
urllib.request.install_opener(opener)
3b、调用opener
opener.open(url)
import urllib.request import random#此网址显示当前IP的所在地址 url = 'http://www.whatismyip.com.tw'iplist=['123.139.56.238:9999','163.125.158.250:8888','113.200.214.164:9999','111.11.98.58:9000','221.178.176.25:3128']proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})opener = urllib.request.build_opener(proxy_support) opener.addheaders=[('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36')]urllib.request.install_opener(opener)response=urllib.request.urlopen(url)html = response.read().decode('utf-8')print(html)
二、动手题
1、编写一个爬虫,爬百度百科“网络爬虫”的词条,(连接: http://baike.baidu.com/view/284853.htm),将所有包含“view”的连接按下边格式打印出来:
''' |-- 代码解析思路: |-- 1、通过bs4的BeautifulSoup来获取html的源代码 |-- 2、从源代码中找到包含"view"的href链接 |-- 3、把获取出来的连接打印出来 '''import urllib.request import re from bs4 import BeautifulSoup import ssl ssl._create_default_https_context = ssl._create_unverified_contextdef main():url = 'http://baike.baidu.com/view/284853.htm'response = urllib.request.urlopen(url)html = response.read()#采用BeautifulSoup来获取html源代码soup = BeautifulSoup(html,'html.parser') #使用python默认的解析器#源代码中找到包含view的href地址#正则表达式(re.compile之后的对象)for each in soup.find_all(href = re.compile("view")):print("=======\n",each)#join():拼接字符串,元组,列表中的元素#os.path.join():将多个路径组合后返回context = ''.join([each.text])url2 = ''.join(["http://baike.baidu.com",each["href"]])print(context,"-->",url2)# print(each.text,"-->",''.join(["http://baike.baidu.com",each["href"]]))if __name__ == "__main__":main()
''' =======<a href="/wikicategory/view?categoryName=恐龙大全" target="_blank">恐龙百科</a> 恐龙百科 --> http://baike.baidu.com/wikicategory/view?categoryName=恐龙大全 =======<a href="/wikicategory/view?categoryName=多肉植物" target="_blank">多肉百科</a> 多肉百科 --> http://baike.baidu.com/wikicategory/view?categoryName=多肉植物 =======<a class="lock-lemma" href="/view/10812319.htm" nslog-type="10003105" target="_blank" title="锁定"><em class="cmn-icon wiki-lemma-icons wiki-lemma-icons_lock-lemma"></em>锁定</a> 锁定 --> http://baike.baidu.com/view/10812319.htm'''
知识扩展:
https://www.cnblogs.com/franknihao/p/6542460.html
https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/index.html
2、直接打印词条名和连接不算什么本事,这题要求你的爬虫允许用户输入关键词,然后爬虫进入每一个词条,然后检索该词条是否具有副标题,如果有,请将副标题一块打印出来
# encoding:utf-8 import urllib.request import urllib.parse import re from bs4 import BeautifulSoup import ssl ssl._create_default_https_context = ssl._create_unverified_contextdef main():keyword = input("请输入检索的词:")#把keyword转换成python识别的字符串#https://baike.baidu.com/search/word?word=%E8%83%A1%E6%AD%8Ckeyword = urllib.parse.urlencode({"word":keyword})#打开网页response = urllib.request.urlopen("https://baike.baidu.com/search/word?%s" %keyword)#获取网页输出html = response.read()#使用BeautifulSoup读取网页源代码soup = BeautifulSoup(html,"html.parser")#中文字符用于判断是否是中文zh_pattern = re.compile(u'[\u4e00-\u9fa5]+')#开始第二遍的遍历for each in soup.find_all(href = re.compile("view")):#find_all 代表全文搜索,find 只显示一条结果#href = re.compile("view") 如下例子:#<a target=_blank href=/view/5458338.htm>一念执着</a>#re.compile("view") 正则匹配有view关键字的链接#print("each--",each)#获取链接的标题#<a href="/wikicategory/view?categoryName=多肉植物" target="_blank">多肉百科<>#context = 多肉百科context = ''.join([each.text])#如果标题为空,则终止本次循环if context == "":continue#拼接新的URL链接#(http://baike.baidu.com)+ (/wikicategory/view?categoryName=多肉植物)url2 =''.join(["http://baike.baidu.com",each["href"]])#出现一个问题,如果链接是完整的,然后在加上前缀就不对了#http: // baike.baidu.comhttp: // baike.baidu.com / view / 12878522.htm#如果url2中出现中文,就终止本次循环,因为编码不一样就会报错然后结束程序if zh_pattern.search(url2):continue# 打开网址如下:# http://baike.baidu.com/view/482616.htm# 然后获取网页内容response2 = urllib.request.urlopen(url2)html2 = response2.read()soup2 = BeautifulSoup(html2,"html.parser")#如果网页h2标签存在(即:副标题存在),则重新定义contextif soup2.h2:context = ''.join([context,soup2.h2.text])context = ''.join([context,"-->",url2])#打印完整的内容:标题+副标题 --> url链接print(context)if __name__ == "__main__":main()
''' /usr/local/bin/python3.7 /Users/wufq/WebCrawler/wc/百度百科搜索.py 请输入检索的词:胡歌 岑参诗作(岑参诗作)-->http://baike.baidu.com/item/%E8%83%A1%E6%AD%8C/18074325#viewPageContent 2011年孙凰发行二胡民乐(2011年孙凰发行二胡民乐)-->http://baike.baidu.com/item/%E8%83%A1%E6%AD%8C/22240446#viewPageContent 锁定目录-->http://baike.baidu.com/view/10812319.htm 一念执着-->http://baike.baidu.com/view/5458338.htm 逍遥叹(胡歌演唱歌曲)-->http://baike.baidu.com/view/345628.htm 一吻天荒目录-->http://baike.baidu.com/view/8130305.htm 忘记时间-->http://baike.baidu.com/view/2492625.htm 六月的雨目录-->http://baike.baidu.com/view/34074.htm 光棍(单身人士称谓)-->http://baike.baidu.com/view/88402.htm 天亮以后-->http://baike.baidu.com/view/482616.htm 月光(胡彦斌演唱《秦时明月》系列片头曲)-->http://baike.baidu.com/view/18752.htm 乌云然目录-->http://baike.baidu.com/view/1639821.htm 敢不敢爱(胡歌演唱歌曲)-->http://baike.baidu.com/view/2894946.htm 高手(2005年潘玮柏音乐专辑)-->http://baike.baidu.com/view/91601.htm 我不做英雄目录-->http://baike.baidu.com/view/5930821.htmProcess finished with exit code 0'''
转载于:https://www.cnblogs.com/frankruby/p/10081444.html
【Python55--爬虫:代理】相关推荐
- 介绍一种 Python 更方便的爬虫代理池实现方案
现在搞爬虫,代理是不可或缺的资源 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识 ...
- python 代理ip池_GitHub - xuan525/proxy_pool: Python爬虫代理IP池(proxy pool)
ProxyPool 爬虫代理IP池 ______ ______ _ | ___ \_ | ___ \ | | | |_/ / \__ __ __ _ __ _ | |_/ /___ ___ | | | ...
- python爬虫代理ip_Python爬虫如何获取代理ip及ip验证?
如何获取大量的公开数据信息,这是我们互联网在竞争激烈的环境中的生存之道,不管在什么环境下都要学习和了解用户市场,客户需求,竞争对手,如何能获取到大量的数据信息,那么就需要用到网络爬虫. 在我们从事py ...
- selenium+python设置爬虫代理IP
selenium+python设置爬虫代理IP 1. 背景 在使用selenium浏览器渲染技术,爬取网站信息时,一般来说,速度是很慢的.而且一般需要用到这种技术爬取的网站,反爬技术都比较厉害,对IP ...
- 记录vultr搭建https爬虫代理
记录vultr搭建https爬虫代理 记录vultr搭建https爬虫代理 准备 安装squid和httpd-tools,直接yum安装 设置认证的账号密码 配置squid,支持http代理 http ...
- 2018年爬虫代理IP提供商对比
https://www.jianshu.com/p/4c4aa84479eb https://www.jianshu.com/p/f58baf9aaf9c 背景:国内某企业爬虫工程师一枚,每天都在和爬 ...
- 获得代理ippython_Python爬虫代理IP从哪里获取?
如今代理ip被大家广泛使用,尤其是在爬虫工作中,相信许多做分布式深网爬虫的开发者对代理IP非常熟悉.面对网站千变万化的反爬虫策略,代理IP对爬虫工作帮助极大,这点爬虫人员深有体会.很多初学者刚开始入门 ...
- 最新实用Python异步爬虫代理池(开源)
-- Illustrations by Tom Haugomat -- 陈键冬 Python中文社区专栏作者,pyecharts开源项目核心开发者. GitHub:chenjiandongx 项目地 ...
- scrapy爬虫-代理设置
scrapy爬虫-代理设置 1.请求头User-Agent代理设置** 1.1 找到middlewares.py 1.2 找到一个绑定的DownloaderMiddlewar(生成scrapy爬虫目录 ...
- 使用爬虫代理错误问题解决方案
在如今的互联网时代,网络爬虫成了许多企业的重要岗位之一.当然在数据采集中会遇到各种问题,例如限制IP,出现访问验证码等.这种时候就需要各种反爬策略和使用HTTP代理去解决问题.在爬虫用在使用代理的时候 ...
最新文章
- 基于FPGA的SPI FLASH控制器设计
- Mac下打开多个eclipse
- 函数的傅立叶展开掐死我吧_关于文章《傅里叶分析之掐死教程》的再一点小思考...
- 一篇彻底搞懂jsp内置对象
- pytorch optim.SGD
- 微软数据视界:图解数据分析价值
- gogs: 如何恢复repository
- 版本设置X:none node Title golang版本错误
- 最具潜力的编程语言GO有新书啦!
- java小游戏 : 飞翔的小鸟 (完整版)
- ASSIMP的数据结构
- linux android投屏,Github开源Android投屏软件——Scrcpy
- 用esp8266开发板制作WiFi Killer
- 边沿触发是什么意思_epoll 水平触发 边沿触发
- 如何使网站被搜索引擎快速收录
- python十六进制转换成二进制_python - 将十六进制转换为二进制
- shell 命令下载软件 安装软件
- 飞桨PP-HumanSeg本地实时视频推理代码解读
- iOS备忘录之华文宋体字库下载
- GRE配置详解和路由黑洞及检测机制