随着我们爬行动物的速度加快,我们往往意识到数据爬不上去,就试着打印一下。
不返回数据,而且一言不发
你熟悉吗?
想想看。 人是怎么访问网站的? 发送请求。 是的。 那么…
request.headers,
当sydfg疯狂地请求别人的网站时,我觉得人的网站管理员有点奇怪
他看到要求的header信息,吓了一跳。 于是,看到的headers信息如下。
host :127.0.0.133603369用户代理: python-requests/3.21.0 accept-encoding 3360 gzip,deflateaccept33666
用户代理: python-requests/3.21.0
居然用python的库委托,说明你暴露了。 人不封你很奇怪吗?
那怎么办? 你在欺骗自己。
python不能伪装。 因为浏览器可以伪装,所以可以修改浏览器的请求标题。
简而言之,就是让自己的python爬虫假装浏览器。
伪装Header的哪里?
要让自己的python爬虫假装浏览器,请伪装headers。 headers有很多字段。 我们主要注意几个字段吗? headers数据通常可以是这两个,但我们强烈建议爬行动物对每个请求都使用用户代理,“referer”需要时添加,不需要时不使用。 什么是Referer? 以后补充知识点)
图标:
上面的几个重要点说明如下。
请求头:
“我是人! ”3354用户代理的修改:保存系统和浏览器的模型版本,通过修改使其看起来像自己是人。
“来自台湾省”——修正referer :也有网站告诉服务器是从哪个网站进来的,并进行检查,而不是凭空而来。
“饼干! ”:带饼干还是不带饼干,结果可能不同。 试着拿着饼干去“贿赂”服务器,让她提供完整的信息。
3.headers伪装-随机用户代理
爬行机制:许多站点检测Headers用户代理,而一些站点检测Referer。 一些资源站点的防盗链会检测到Referer。
随机用户代理生成:生成随机用户代理。 这样可以获得各种浏览器的外观。
(代码马上就能用了,复印一下带过去就行了)
#!/usr/HP dbl/python3# @ readme :关于检测逆向headers伪装#headers的反爬行动物from fake _ useragentimportuseragent #下载: pipining # 1.指定浏览器的请求标头print(UA.ie ) print ) UA.opera ) print ) UA.chrome (print ) ua.Google (print ) ua.chrome ua.random方式导入请求SUA=用户代理) )打印) ua.random )随机产生headers={ '用户代理' 3360 ua.readers } ' response=requests.get(URL,headers=headers ) print(response.status_code ) ) )是
如果想爬照片,照片防盗链就用Referer。
headers=‘user-agent’: ua.random,‘referer’:‘在此插入图像主页’}
遇到防盗链图片时,首先爬上所有图片的地址. jpg,将它们保存在列表中,循环访问图片地址,以‘WB’格式打开并写入文件,文件名根据图片地址动态更改
这基本上是你的爬虫对象必须是认真的图像网站才能使用。
4.2.1自制的ip代理池多线程爬虫
就是自己收集网上公开的免费ip,自建自己的ip代理池。
就是通过python程序获取大量互联网上免费的代理ip,并定时检测这些ip是否可用。 那么,下次使用代理ip时,只需要带到自己的ip代理池即可。
简单来说,访问免费代理网站-正则/xpath提取ip和端口-测试ip是否可用“如果可用则保存”将使用ip爬虫过期并放弃ip。
此进程可以使用多线程或异步方法。 这是因为检查代理是一个非常慢的过程。
这是来源于网络的一个西刺代理的多线程ip代理爬虫:(我不用)
#!/usr/hpdbl/python3#@Readme : IP代理==模拟一个ip地址去访问某个网站(爬的次数太多,ip被屏蔽)# 多线程的方式构造ip代理池。from bs4 import BeautifulSoupimport requestsfrom urllib import request, errorimport threadingimport osfrom fake_useragent import UserAgentinFile = open('proxy.txt') # 存放爬虫下来的ipverifiedtxt = open('verified.txt') # 存放已证实的可用的iplock = threading.Lock()def getProxy(url): # 打开我们创建的txt文件 proxyFile = open('proxy.txt', 'a') # 伪装 ua = UserAgent() headers = { 'User-Agent': ua.random } # page是我们需要获取多少页的ip,这里我们获取到第9页 for page in range(1, 10): # 通过观察URL,我们发现原网址+页码就是我们需要的网址了,这里的page需要转换成str类型 urls = url + str(page) # 通过requests来获取网页源码 rsp = requests.get(urls, headers=headers) html = rsp.text # 通过BeautifulSoup,来解析html页面 soup = BeautifulSoup(html,'html.parser') # 通过分析我们发现数据在 id为ip_list的table标签中的tr标签中 trs = soup.find('table', id='ip_list').find_all('tr') # 这里获得的是一个list列表 # 我们循环这个列表 for item in trs[1:]: # 并至少出每个tr中的所有td标签 tds = item.find_all('td') # 我们会发现有些img标签里面是空的,所以这里我们需要加一个判断 if tds[0].find('img') is None: nation = '未知' locate = '未知' else: nation = tds[0].find('img')['alt'].strip() locate = tds[3].text.strip() # 通过td列表里面的数据,我们分别把它们提取出来 ip = tds[1].text.strip() port = tds[2].text.strip() anony = tds[4].text.strip() protocol = tds[5].text.strip() speed = tds[6].find('div')['title'].strip() time = tds[8].text.strip() # 将获取到的数据按照规定格式写入txt文本中,这样方便我们获取 proxyFile.write('%s|%s|%s|%s|%s|%s|%s|%sn' % (nation, ip, port, locate, anony, protocol, speed, time))def verifyProxyList(): verifiedFile = open('verified.txt', 'a') while True: lock.acquire() ll = inFile.readline().strip() lock.release() if len(ll) == 0: break line = ll.strip().split('|') ip = line[1] port = line[2] realip = ip + ':' + port code = verifyProxy(realip) if code == 200: lock.acquire() print("---Success成功:" + ip + ":" + port) verifiedFile.write(ll + "n") lock.release() else: print("---Failure失败:" + ip + ":" + port)def verifyProxy(ip): ''' 验证代理的有效性 ''' ua = UserAgent() requestHeader = { 'User-Agent': ua.random } url = "http://www.baidu.com" # 填写代理地址 proxy = {'http': ip} # 创建proxyHandler proxy_handler = request.ProxyHandler(proxy) # 创建opener proxy_opener = request.build_opener(proxy_handler) # 安装opener request.install_opener(proxy_opener) try: req = request.Request(url, headers=requestHeader) rsq = request.urlopen(req, timeout=5.0) code = rsq.getcode() return code except error.URLError as e: return eif __name__ == '__main__': # 手动新建两个文件 filename = 'proxy.txt' filename2 = 'verified.txt' if not os.path.isfile(filename): inFile = open(filename, mode="w", encoding="utf-8") if not os.path.isfile(filename2): verifiedtxt = open(filename2, mode="w", encoding="utf-8") tmp = open('proxy.txt', 'w') tmp.write("") tmp.close() tmp1 = open('verified.txt', 'w') tmp1.write("") tmp1.close() # 多线程爬虫西刺代理网,找可用ip getProxy("http://www.xicidaili.com/nn/") getProxy("http://www.xicidaili.com/nt/") getProxy("http://www.xicidaili.com/wn/") getProxy("http://www.xicidaili.com/wt/") all_thread = [] for i in range(30): t = threading.Thread(target=verifyProxyList) all_thread.append(t) t.start() for t in all_thread: t.join() inFile.close() verifiedtxt.close()运行一下,效果:
爬出来的可用的很少或者很短:
4.2.3 开源 ip代理池—ProxyPool(吐血推荐)
类比线程池,进程池,懂了吧?
这是俺发现的一个不错的开源 ip 代理池ProxyPool,可以用windows系统的,至少Python3.5以上环境哟,还需要将Redis服务开启。
现成的代理池,还不用起来?
ProxyPool下载地址:
https://github.com/Python3WebSpider/ProxyPool.git
(可以手动下载也可以使用git下来。)
1.ProxyPool的使用:
首先使用 git clone 将源代码拉到你本地,
3.进入proxypool目录,修改settings.py文件,PASSWORD为Redis密码,如果为空,则设置为None。(新装的redis一般没有密码。)
(如果你没 redis 的话,可以先去下载了安装了再来看吧。)
(假设你的redis已经安装完成。)
4.接着在你 clone 下来的文件目录中(就是这个ProxyPool存的电脑路径 )
5.安装相关所需的 依赖包:
(pip或pip3)
(如果你把ProxyPool导入在pycharm里面,那就一切都在pycharm里面搞就可以了。
6.接下来开启你的 redis服务,
直接cmd 打开dos窗口,运行:redis-server.exe
即可开启redis服务器。redis 的默认端口就是 6379
7.接着就可以运行 run.py 了。
可以在cmd里面命令方式运行,也可以导入pycharm里面运行。
图示:
8.运行 run.py 以后,你可以打开你的redis管理工具,或者进入redis里面查看,这时候在你的 redis 中就会存入很多已经爬取到的代理 ip 了:
9.项目跑起来之后,【不要停止】,此时redis里面存了ip,就可以访问这个代理池了。
在上面的图中,可以看到有这么一句话
Running on http://0.0.0.0:5555/ (Press CTRL+C to quit)
这就是告诉我们随机访问地址URL是多少。
10.在浏览器中随机获取一个代理 ip 地址:
你就浏览器输入:
http://0.0.0.0:5555/random
11.在代码中随机获取一个ip代理
就这样:
import requests# 随机ip代理获取PROXY_POOL_URL = 'http://localhost:5555/random'def get_proxy(): try: response