日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

python怎么暂停爬虫_python Python爬虫防封杀方法集合

發(fā)布時(shí)間:2023/12/3 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 python怎么暂停爬虫_python Python爬虫防封杀方法集合 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在爬取的過程中難免發(fā)生ip被封和403錯(cuò)誤等等,這都是網(wǎng)站檢測出你是爬蟲而進(jìn)行反爬措施,這里自己總結(jié)下如何避免

方法1:設(shè)置等待時(shí)間

有一些網(wǎng)站的防范措施可能會(huì)因?yàn)槟憧焖偬峤槐韱味涯惝?dāng)做機(jī)器人爬蟲,比如說以非常人的速度下載圖片,登錄網(wǎng)站,爬取信息。

常見的設(shè)置等待時(shí)間有兩種,一種是顯性等待時(shí)間(強(qiáng)制停幾秒),一種是隱性等待時(shí)間(看具體情況,比如根據(jù)元素加載完成需要時(shí)間而等待)

1.顯性等待時(shí)間

import time#導(dǎo)入包

time.sleep(3)#設(shè)置時(shí)間間隔為3秒

而且盡量在夜深人靜的時(shí)候進(jìn)行數(shù)據(jù)的采集,切記采集不要太快,不然容易讓網(wǎng)站識(shí)別出你個(gè)非人類

2.隱式等待

這里用到的主要語句,以wait.until()為例

比如說形式如下

wait1.until(lambda driver: driver.find_element_by_xpath("//div[@id='link-report']/span"))

上面的語句就是在等待頁面元素加載全部完成后才進(jìn)行下一步操作,因?yàn)榕老x速度太快,導(dǎo)致一些元素沒有被加載完全就進(jìn)行下一步操作而導(dǎo)致沒有查找到元素或者被網(wǎng)站認(rèn)為是機(jī)器人在進(jìn)行瀏覽。

方法2:修改請(qǐng)求頭

識(shí)別你是機(jī)器人還是人類瀏覽器瀏覽的重要依據(jù)就是User-Agent,比如人類用瀏覽器瀏覽就會(huì)使這個(gè)樣子的User-Agent:'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'

這里拿urllib2來說,默認(rèn)的User-Agent是Python-urllib2/2.7,所以要進(jìn)行修改。

import urllib2

req = urllib2.Request(url)

#多了以下一這一步而已

req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')

response = urllib2.urlopen(req)

方法3:采用代理ip

當(dāng)自己的ip被網(wǎng)站封了之后,只能采取換代理ip的方式進(jìn)行爬取,所以,我建議,每次爬取的時(shí)候盡量用代理來爬,封了代理,還有代理,無窮無盡啊,可別拿代理去黑學(xué)校網(wǎng)站啊,你懂得0.0

廢話不多說,扔上代理的實(shí)現(xiàn)程序

# -*- coding: utf-8 -*-

import urllib2

url = "http://www.ip181.com/"

proxy_support = urllib2.ProxyHandler({'http':'121.40.108.76'})

#參數(shù)是一個(gè)字典{'類型':'代理ip:端口號(hào)'}

opener = urllib2.build_opener(proxy_support)

#定制opener

opener.add_handler=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]

#add_handler給加上偽裝

urllib2.install_opener(opener)

response = urllib2.urlopen(url)

print response.read().decode('gbk')

這里采用的測試網(wǎng)站是http://www.ip181.com,?它可以檢測出你使用的ip是什么,正好來檢驗(yàn)自己是否用代理ip成功

使用代理ip訪問

從結(jié)果中可以看出,檢測出了代理ip,正是我自己加上的ip值,此乃最后一招,當(dāng)自己ip被封后,采用代理ip進(jìn)行訪問。

要是一個(gè)代理ip掛了怎么辦,那你可以做個(gè)ip池啊,就是把一堆代理ip放在一起,每次運(yùn)行時(shí)從ip池挑一個(gè)代理ip當(dāng)做訪問ip就可以了!

采用ip池的方法~舉個(gè)栗子

# -*- coding: utf-8 -*-

import urllib2

import random

ip_list=['119.6.136.122','114.106.77.14']

#使用一組ip調(diào)用random函數(shù)來隨機(jī)使用其中一個(gè)ip

url = "http://www.ip181.com/"

proxy_support = urllib2.ProxyHandler({'http':random.choice(ip_list)})

#參數(shù)是一個(gè)字典{'類型':'代理ip:端口號(hào)'}

opener = urllib2.build_opener(proxy_support)

#定制opener

opener.add_handler=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')]

#add_handler給加上偽裝

urllib2.install_opener(opener)

response = urllib2.urlopen(url)

print response.read().decode('gbk')

使用ip池抽取ip訪問

采用代理ip池的方法,可以看出,檢測出的ip是ip池中的一個(gè),對(duì)吧,很簡單對(duì)不對(duì),那么怎么來創(chuàng)建ip池呢,也很簡單,用動(dòng)態(tài)或者靜態(tài)方法隨便找個(gè)匿名ip的網(wǎng)站進(jìn)行代理ip爬取,然后清洗一下ip,把能用的(測試一個(gè)簡單的返回狀態(tài)網(wǎng)頁)留下來寫到列表里,然后就可以形成ip池啦,最后當(dāng)某個(gè)ip不能用了,那就從池中剔除!ip池制作,建議參考@七夜的故事--代理ip池

方法4:避開不可見元素陷阱

自己爬著爬著就把隱藏元素都爬出來了,你說你自己是不是爬蟲吧,這是網(wǎng)站給爬蟲的陷阱,只要發(fā)現(xiàn),立馬封IP,所以請(qǐng)查看一下元素再進(jìn)行爬取!

比如說這個(gè)網(wǎng)址,一個(gè)簡單的登錄頁面,從審查元素中我們可以看到有一些元素是不可見的!(例子抄自python網(wǎng)絡(luò)數(shù)據(jù)采集第12章)

上述中可以看到隱藏的value和不顯示的url

查找出陷阱url和不可見的value代碼

from selenium import webdriver

#from selenium.webdriver.remote.webelement import WebElement

url = 'http://pythonscraping.com/pages/itsatrap.html'

driver = webdriver.PhantomJS(executable_path="phantomjs.exe")

driver.get(url)

links = driver.find_elements_by_tag_name("a")

for link in links:

if not link.is_displayed():

print "the link "+link.get_attribute("href")+"is a trap"

fields = driver.find_elements_by_tag_name("input")

for field in fields:

if not field.is_displayed():

print "do not change value of "+field.get_attribute("name")

結(jié)果就是

the link http://pythonscraping.com/dontgohereis a trap

do not change value of phone

do not change value of email

方法5:采用分布式爬取

分布式爬取,針對(duì)比較大型爬蟲系統(tǒng),實(shí)現(xiàn)步驟如下所示

1.基本的http抓取工具,如scrapy

2.避免重復(fù)抓取網(wǎng)頁,如Bloom Filter

3.維護(hù)一個(gè)所有集群機(jī)器能夠有效分享的分布式隊(duì)列

4.將分布式隊(duì)列和Scrapy結(jié)合

5.后續(xù)處理,網(wǎng)頁析取(python-goose),存儲(chǔ)(Mongodb)

(知乎上看到的補(bǔ)充一下)

采用Scrapy的例子,請(qǐng)參考這里基于Scrapy對(duì)Dmoz進(jìn)行抓取

方法6:進(jìn)行模擬登陸

這個(gè)就太多了,一般用Selenium,可以結(jié)合Firefox或者是無頭瀏覽器PhantomJS,這個(gè)做的東西比較多了,如果感興趣,可以點(diǎn)擊這些,進(jìn)行查看,方法,代碼,解析,一應(yīng)俱全

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的python怎么暂停爬虫_python Python爬虫防封杀方法集合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。