最近学习Python,网上学习资料挺多的,这篇写的不错,关于python爬虫可以抢票吗和用python抢票犯法吗,大家有需要也可以看看。
在爬取的过程中难免发生ip被封和403错误等等,这都是网站检测出你是爬虫而进行反爬措施,这里自己总结下如何避免
import time#导入包 time.sleep(3)#设置时间间隔为3秒而且尽量在夜深人静的时候进行数据的采集,切记采集不要太快,不然容易让网站识别出你个非人类 2.隐式等待 这里用到的主要语句,以wait.until()为例 比如说形式如下
wait1.until(lambda driver: driver.find_element_by_xpath("//div[@id='link-report']/span"))上面的语句就是在等待页面元素加载全部完成后才进行下一步操作,因为爬虫速度太快,导致一些元素没有被加载完全就进行下一步操作而导致没有查找到元素或者被网站认为是机器人在进行浏览。 具体的案例可以在我以前的文章中详细应用 Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)
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)
# -*- coding: utf-8 -*- import urllib2 url = "http://www.ip181.com/" proxy_support = urllib2.ProxyHandler({'http':'121.40.108.76'}) #参数是一个字典{'类型':'代理ip:端口号'} 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')这里采用的测试网站是 http://www.ip181.com, 它可以检测出你使用的ip是什么,正好来检验自己是否用代理ip成功 使用代理ip访问 从结果中可以看出,检测出了代理ip,正是我自己加上的ip值,此乃最后一招,当自己ip被封后,采用代理ip进行访问。 要是一个代理ip挂了怎么办,那你可以做个ip池啊,就是把一堆代理ip放在一起,每次运行时从ip池挑一个代理ip当做访问ip就可以了! 采用ip池的方法~举个栗子
# -*- coding: utf-8 -*- import urllib2 import random ip_list=['119.6.136.122','114.106.77.14'] #使用一组ip调用random函数来随机使用其中一个ip url = "http://www.ip181.com/" proxy_support = urllib2.ProxyHandler({'http':random.choice(ip_list)}) #参数是一个字典{'类型':'代理ip:端口号'} 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池中的一个,对吧,很简单对不对,那么怎么来创建ip池呢,也很简单,用动态或者静态方法随便找个匿名ip的网站进行代理ip爬取,然后清洗一下ip,把能用的(测试一个简单的返回状态网页)留下来写到列表里,然后就可以形成ip池啦,最后当某个ip不能用了,那就从池中剔除!ip池制作,建议参考 @七夜的故事--代理ip池
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")结果就是
the link http://pythonscraping.com/dontgohereis a trap do not change value of phone do not change value of email
分布式爬取,针对比较大型爬虫系统,实现步骤如下所示 1.基本的http抓取工具,如scrapy 2.避免重复抓取网页,如Bloom Filter 3.维护一个所有集群机器能够有效分享的分布式队列 4.将分布式队列和Scrapy结合 5.后续处理,网页析取(python-goose),存储(Mongodb) (知乎上看到的补充一下)采用Scrapy的例子,请参考这里 基于Scrapy对Dmoz进行抓取
转载于:https://www.cnblogs.com/tian-sun/p/7404439.html
吸猫:奇葩调皮 大家喜欢可以收藏我的博客:OpenEIM