【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']= ''
data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b'
data['ts']= ''
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 hashlib while True: #用户输入翻译的内容
content = input('请输入需要翻译的内容(输入q!退出程序):')
if content=='q!':
break
#连接url地址
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #发送给服务器请求的数据
data = {}
#此部分数据来源于:FromData
data['i']= content
data['from']= 'AUTO'
data['to']= 'AUTO'
data['smartresult']= 'dict'
data['client']= 'fanyideskweb'
data['salt']= ''
data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b'
data['ts']= ''
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_context def 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_context def main():
keyword = input("请输入检索的词:")
#把keyword转换成python识别的字符串
#https://baike.baidu.com/search/word?word=%E8%83%A1%E6%AD%8C
keyword = 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标签存在(即:副标题存在),则重新定义context
if 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.htm Process finished with exit code 0 '''
【Python55--爬虫:代理】的更多相关文章
- Python爬虫代理池
爬虫代理IP池 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来 ...
- 通过爬虫代理IP快速增加博客阅读量——亲测CSDN有效!
写在前面 题目所说的并不是目的,主要是为了更详细的了解网站的反爬机制,如果真的想要提高博客的阅读量,优质的内容必不可少. 了解网站的反爬机制 一般网站从以下几个方面反爬虫: 1. 通过Headers反 ...
- 【python3】如何建立爬虫代理ip池
一.为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑.在一段时间内被禁止访问. 这种时候,可 ...
- 维护爬虫代理IP池--采集并验证
任务分析 我们爬的免费代理来自于https://www.kuaidaili.com这个网站.用`requests`将ip地址与端口采集过来,将`IP`与`PORT`组合成`requests`需要的代理 ...
- 建立爬虫代理IP池
单线程构建爬虫代理IP池 #!/usr/bin/python3.5 # -*- coding:utf-8 -*- import time import tempfile from lxml impor ...
- 写了个爬虫代理ip的脚本给大家使用
写了个爬虫代理ip的脚本给大家使用 一.代码 import requests from lxml.html import etree url = 'http://www.kuaidaili.com/f ...
- 介绍一种 Python 更方便的爬虫代理池实现方案
现在搞爬虫,代理是不可或缺的资源 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那 ...
- cralwer_爬虫代理中心的简要设计
代理中心: 简单讲: 精细化控制限制资源的使用,保证有限资源的充分利用及有效性.支持动态增减,实时更新. 需求 rest api提供请求输入与输出 客户端使用代理心跳接收,用于更新代理的使用次数,被占 ...
- crawler_爬虫代理方案
爬虫往往会遇到各种限制ip问题 理方案(爬虫) IP代理软件 优势标记: 是 自动切换IP 基本无开发成本标记: 黄色, 考虑切换IP时 ,网络瞬时异常 IP池,由商家维护 劣势标记: 非 部署 每个 ...
- 可能是一份没什么用的爬虫代理IP指南
写在前面 做爬虫的小伙伴一般都绕不过代理IP这个问题. PS:如果还没遇到被封IP的场景,要不就是你量太小人家懒得理你,要不就是人家压根不在乎... 爬虫用户自己是没有能力维护一系列的代理服务器和代理 ...
随机推荐
- Selenium基础知识(八)文本域处理textarea
textarea文本域selenium有时处理不了,但是我们可以采用迂回,解决这个问题 那么,我们用到了execute_script()方法来调用javascript来解决这个问题 这其中涉及DOM, ...
- RNN通俗理解
让数据间的关联也被 NN 加以分析,我们人类是怎么分析各种事物的关联,?最基本的方式,就是记住之前发生的事情. 那我们让神经网络也具备这种记住之前发生的事的能力. 再分析 Data0 的时候, 我们把 ...
- oauth2.0学习笔记(摘抄简化)
大量摘抄白话简明教程. 附:可以参考<RFC6749协议中文版及oauth2.0>文档 一.OAuth 白话简明教程 1.简述 http://www.cnblogs.com/Ceri/p/ ...
- 水题T,二进制转16进制
输入一个2进制的数,要求输出该2进制数的16进制表示. 在16进制的表示中,A-F表示10-15 Input第1行是测试数据的组数n,后面跟着n行输入.每组测试数据占1行,包括一个以0和1组成的字符串 ...
- 强化学习--DeepQnetwork 的一些改进
Double DQN 算Q值 与选Q值是分开的,2个网络. Multi-step Dueling DQN 如果更新了,即使有的action没有被采样到,也会更新Q值 Prioritized Reply ...
- Linq To SQL LEFT OUTER JOIN (Left Join)
SQL: SELECT [t0].[ProductName], [t1].[TotalPrice] AS [TotalPrice] FROM [Product] AS [t0] LEFT OUTER ...
- BestCoder Round #55 ($)
C 构造一个矩阵,然后采用矩阵快速幂 #include <iostream> #include <algorithm> #include <string.h> #i ...
- hdu3037 lucas
题意 : 给了n课不同的树,要求将 0,1,2,3,4,5,...m个松果,分别放在n棵树上的方案数有多少, 我们这样考虑, 如果将m个相同的松果 放入n棵树中 , 转化一下,我们让每个点至少放1个 ...
- CSS选择符-----关系选择符
包含选择符(E F) 选择所有被E元素包含的F元素 与 子选择符(E>F) 不同的是,包含选择符将会命中所有符合条件的后代,包括儿子,孙子,孙子的孙子... <! ...
- tr字符串的梗
工作问题总结 声明:应用程序代码为前人所写,仅仅只是维护代码,暂且不论代码风格瑕疵. 结论: 使用tr“包”起来的字符串,可能会被翻译为不同的语言,此时,应用程序在不同语言环境下可能会表现BUG. 1 ...