关于反爬虫的下结论,关于反爬虫的部分不难计算

.net 新闻搜集ajax数据

1、爬取进度中的30二重定向

在爬取有个别网址速度过快恐怕爆发的请求过多的时候,网址会向您所在的客户端发送二个链接,须求你去验证图片。小编在爬链家和拉钩网的历程中就早已碰着过:

亚洲必赢官网 1

对此30二重定向的标题,是由于抓取速度过快引起互联网流量极度,服务器度和胆识别出是机械发送的伸手,于是将请求重临链接定到某壹特定链接,大多是验证图片或空链接。

在那种时候,既然已经被辨认出来了,就采纳代理ip再持续抓取。

爬虫与反爬虫,那相爱相杀的1对,简直能够写出一部壮观的斗争史。而在大数额时期,数据就是金钱,很多商行都为投机的网址使用了反爬虫机制,幸免网页上的数码被爬虫爬走。但是,如若反爬机制过于严峻,恐怕会风险到实在的用户请求;即便既要和爬虫死磕,又要力保相当低的误伤率,那么又会加大研究开发的资产。

有了前两篇的功底,接下去通过抓取天猫和Taobao的多少来详细表达,怎样通过Scrapy爬取想要的内容。完整的代码:[不带数据库版本][
数据库版本]。

关于.net音信征集的素材很多,可是倘使采集的网址是ajax异步加载数据的情势,又怎么搜集呢?今日就把本身做音讯征集时,所碰着的有的难点和感受跟大家分享一下。

2、headers头文件

多少网址对爬虫反感,对爬虫请求壹律拒绝,那时候大家要求伪装成浏览器,通过修改http中的headers来完毕

 

 1 headers = {
 2 'Host': "bj.lianjia.com",
 3 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
 4 'Accept-Encoding': "gzip, deflate, sdch",
 5 'Accept-Language': "zh-CN,zh;q=0.8",
 6 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36",
 7 'Connection': "keep-alive",
 8 }
 9 p = requests.get(url, headers=headers)
10 print(p.content.decode('utf-8'))

 

简单来说低级的爬虫速度快,伪装度低,假若未有反爬机制,它们得以快速的抓取多量数码,甚至因为请求过多,造成服务器不可能健康工作。

需求

透过天猫的查找,获取搜索出来的每件货物的销量、收藏数、价格。

征集网址的二种办法与利弊:

三、模拟登6

诚如登录的历程都伴随有验证码,那里大家通过selenium本身协会post数据开始展览付出,将回来验证码图片的链接地址输出到控制台下,点击图片链接识别验证码,输入验证码并交付,完毕报到。

 1 from selenium import webdriver
 2 from selenium.webdriver.common.keys import Keys    #
 3 from selenium.webdriver.support.ui import WebDriverWait   # WebDriverWait的作用是等待某个条件的满足之后再往后运行
 4 from selenium.webdriver import ActionChains
 5 import time
 6 import sys
 7 driver = webdriver.PhantomJS(executable_path='C:\PyCharm 2016.2.3\phantomjs\phantomjs.exe')  # 构造网页驱动
 8 
 9 driver.get('https://www.zhihu.com/#signin')       # 打开网页
10 driver.find_element_by_xpath('//input[@name="password"]').send_keys('your_password')
11 driver.find_element_by_xpath('//input[@name="account"]').send_keys('your_account')
12 driver.get_screenshot_as_file('zhihu.jpg')                   # 截取当前页面的图片
13 input_solution = input('请输入验证码 :')
14 driver.find_element_by_xpath('//input[@name="captcha"]').send_keys(input_solution)
15 time.sleep(2)
16 
17 driver.find_element_by_xpath('//form[@class="zu-side-login-box"]').submit()  # 表单的提交  表单的提交,即可以选择登录按钮然后使用click方法,也可以选择表单然后使用submit方法
18 sreach_widonw = driver.current_window_handle     # 用来定位当前页面
19 # driver.find_element_by_xpath('//button[@class="sign-button submit"]').click()
20 try:
21 dr = WebDriverWait(driver,5)
22 # dr.until(lambda the_driver: the_driver.find_element_by_xpath('//a[@class="zu-side-login-box"]').is_displayed())
23 if driver.find_element_by_xpath('//*[@id="zh-top-link-home"]'):
24 print('登录成功')
25 except:
26 print('登录失败')
27 driver.save_screenshot('screen_shoot.jpg')     #截取当前页面的图片
28 sys.exit(0)
29 driver.quit()   #退出驱动

那在那之中,PhantomJS是一个很棒的exe,下载地址:phantomjs。他得以照猫画虎浏览器行为举办操作。当我们蒙受JS渲染的网页,在应用正则表达式、BS四和xpath
. . .
都心有余而力不足协作出多少时(数据根本没加载上),能够利用PhantomJS模拟浏览器行为发送请求,将会博得网页的原本全体数码。

壹、爬取进程中的302重定向

消除思路

  • 先是,打开Taobao的搜寻页面,在里头输入:硬盘,选中列表形式(因为列表格局尚未广告)。
  • 获得到近年来浏览器上边包车型客车地点:
    https://s.taobao.com/search?q=硬盘&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170316&style=list
  • 在出现的货品列表中有成都百货上千硬盘,大家需求得到到那几个商品的详细新闻,也便是它的跳转链接,比如://detail.tmall.com/item.htm?spm=a230r.1.14.19.QzLRla&id=40000831870&ad_id=&am_id=&cm_id=140105335569ed55e27b&pm_id=&abbucket=14
  • 下一场再把详细地址的剧情总体呼吁出来,里面富含了销量、价格、收藏数据。

为此,最后的目标是透过得到几个页面包车型地铁剧情,二个是摸索结果,从内部找出来每三个货物的详细地址,然后第四个是商品详细内容,从中间获取到销量、价格等。

  1. HttpWebRequest

4、代理ip

当爬取速度过快时,当呼吁次数过多时都面临ip被封的恐怕。由此利用代理也是必需的。

使用request加代理

1 import requests
2 proxies = { "http": "http://10.10.1.10:3128",
3 "https": "http://10.10.1.10:1080",}
4 p = request.get("http://www.baidu.com", proxies = proxies)
5 print(p.content.decode('utf-8'))

使用urllib加代理

 1 user_agent ='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
 2 headers = {'User-Agent':user_agent}
 3 proxy = {'http':'http://10.10.1.10:1080',}
 4 proxy_handler = urllib.request.ProxyHandler(proxy)
 5 opener = urllib.request.build_opener(proxy_handler)
 6 urllib.request.install_opener(opener)
 7 url = "https://www.baidu.com/"
 8 req = urllib.request.Request(url=url,headers=headers)
 9 res = urllib.request.urlopen(req)
10 print(res.read().decode('utf-8'))   # 打印网页内容

在爬取有个别网址速度过快照旧发生的请求过多的时候,网址会向您所在的客户端发送二个链接,要求您去印证图片。我在爬链家和拉钩网的经过中就已经遇到过:

下载网页

有了思路现在我们先下载搜索结果页面,然后再下载页面中每一项详细音信页面。

 def _parse_handler(self, response):
        ''' 下载页面 """
        self.driver.get(response.url) 
        pass

很简单,通过self.driver.get(response.url)就能运用selenium下载内容,假若平昔利用response中的网页内容是静态的。

利用种类自带HttpWebRequest对象,采集网站内容,优点是采集功用快,可是只要网址是ajax异步加载数据的秘诀,是收集不到网页内容的,并且网址并未有动用ajax的章程,在网页中用到了javascript,比如说:网页内容用document.write的艺术出口到网页中的,那种情形也是收获不到剧情的。其次还亟需驾驭对方网址的编码格式(便是网页底部中<meta
charset=”utf-八”/>),假诺采集时网站编码格式错误的话,会导致采集的内容是乱码。但以此是小意思,笔者要好马上查看资料时找到了人家封装好的主意,不过很羞愧因为不明了小编是何人了,小编会把相应的代码下载链接提供给我们。以上的难题是因为js和ajax是急需浏览器去分析的,所以造成了收获不到网页内容。

伍、验证码输入

相见验证的题材,小编一般都是人工识别:获取验证码的链接再控制台下 ——>
点击链接识别验证码 ——> 在控制台手动输入验证码并付诸。

亚洲必赢官网 2

收获想要的内容(Selector)

地方说了何等下载内容,当大家下载好情节后,供给从内部去获取大家想要的有用新闻,那里即将用到选用器,选拔器构造情势相比多,只介绍一种,此处看详细消息:

>>> body = '<html><body>good</body></html>'
>>> Selector(text=body).xpath('//span/text()').extract()
[u'good']

那样就透过xpath取出来了good那一个单词,更详实的xpath教程点击那里。
Selector
提供了众多方法出了xpath,还有css选拔器,正则表明式,关于反爬虫的下结论,关于反爬虫的部分不难计算。中文化教育程看那一个,具体内容就不多说,只须要理解那样能够高速取得大家须求的剧情。

Help.HttpHelp.HttpRequest("采集的网址");

6、ajax加载的多少

对此ajax加载的数量,我们无论通过request或post方法请求获得的网页都心有余而力不足取得。

有关二个网页是还是不是是ajax加载数据,大家只需将网页内容print到控制台下,将其与网页原始内容展开比对,即使有数量不够,那么这几个数量便是ajax加载。例如:大家想获取京东上货品的价位、销量、好评等地方的多寡,不过请求重临的网页中一贯不这一个多少。因为那么些多少是ajax加载。对于ajax加载的页面,一般有三种艺术。

(一)分析网页

按F1贰开拓浏览器调节和测试工具,在Network下抉择XHXC60或Doc标签,分析(双击点开查看)那多少个标签下的链接。如若点开链接打开的网页中恰恰有这几个尚未加载的多少,则那些数据是透过该链接传送的。再对该链接举行规律分析,以后对该链接发送请求。

亚洲必赢官网 3

(二)使用PhantomJS模拟浏览器行为

利用PhantomJS模拟浏览器进行发送请求,获得重返的始末是一心的(ajax加载的数目也会有)。但是使用PhantomJS请求速度过慢,1般3个网页4~伍s时间,不能够忍。一般要动用PhantomJS须要开多线程。

1 driver = webdriver.PhantomJS(executable_path='C:\PyCharm 2016.2.3\phantomjs\phantomjs.exe')  # 构造网页驱动
2 
3 driver.get('https://www.zhihu.com/') 
4 print(driver.page_source)    # 打印网页内容

 

对于30贰重定向的题材,是出于抓取速度过快引起互联网流量万分,服务器度和胆识别出是机器发送的请求,于是将呼吁再次来到链接定到某一一定链接,大多是印证图片或空链接。

拍卖内容

不难易行的介绍了怎么获取内容后,未来我们从第1个搜索结果中拿走我们想要的货物详细链接,通过翻看网页源代码能够见到,商品的链接在那边:

...
<p class="title">
      <a class="J_ClickStat" data-nid="523242229702" href="//detail.tmall.com/item.htm?spm=a230r.1.14.46.Mnbjq5&id=523242229702&ns=1&abbucket=14" target="_blank" trace="msrp_auction" traceidx="5" trace-pid="" data-spm-anchor-id="a230r.1.14.46">WD/西部数据 WD30EZRZ台式机3T电脑硬盘 西数蓝盘3TB 替绿盘</a>
</p>
...

运用在此之前的规则来博取到a成分的href属性便是供给的剧情:

selector = Selector(text=self.driver.page_source) # 这里不要省略text因为省略后Selector使用的是另外一个构造函数,self.driver.page_source是这个网页的html内容
selector.css(".title").css(".J_ClickStat").xpath("./@href").extract() 

简单的讲说一下,那里经过css工具取了class叫title的p成分,然后又获得了class是J_ClickStat的a成分,最终通过xpath规则得到a成分的href中的内容。啰嗦一句css中如若是取id则应该是selector.css("#title"),这一个和css中的选择器是同一的。
同理,我们收获到商品详情后,以得到销量为例,查看源代码:

<ul class="tm-ind-panel">
    <li class="tm-ind-item tm-ind-sellCount" data-label="月销量"><div class="tm-indcon">月销量881</div></li>
    <li class="tm-ind-item tm-ind-reviewCount canClick tm-line3" id="J_ItemRates"><div class="tm-indcon">累计评价4593</div></li>
    <li class="tm-ind-item tm-ind-emPointCount" data-spm="1000988"><div class="tm-indcon"><a href="//vip.tmall.com/vip/index.htm" target="_blank">送天猫积分55</a></div></li>
 </ul>

获得月销量:

selector.css(".tm-ind-sellCount").xpath("./div/span[@class='tm-count']/text()").extract_first()

赢得累计评价:

selector.css(".tm-ind-reviewCount").xpath("./div[@class='tm-indcon']/span[@class='tm-count']/text()").extract_first()

末尾把获得出来的数目包装成Item重返。Tmall或然天猫商城他们的页面内容不平等,所以规则也差别,要求分开去获取想要的内容。

源码下载地址

在这种时候,既然已经被识别出来了,就选取代理ip再持续抓取。

Item使用

Item是scrapy中收获出来的结果,后边能够拍卖这么些结果。

          二.浏览器控件

2、headers头文件

定义

Item一般是放手items.py

import scrapy

class Product(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    stock = scrapy.Field()
    last_updated = scrapy.Field(serializer=str)

因为及时自家付出的时候,用的是cs方式,相信大家壹如既往也会用cs的情势去支付这一个意义。既然是cs格局(不思索赏心悦目)的情状下必将是WinForm,WinForm中有自带的浏览器控件,那么些是倒霉用的,作者当时用的是Geckofx,基于火狐内核的一款浏览器控件,然则这地方的素材很少,当时遇到了部分题材都找不到化解办法,但后来依旧都消除了。用了该控件就足以拿走到ajax异步加载的数量,在网页加载成功以往,延迟几分钟获取网页内容,就足以很有益的获得到网页内容,缺点是相持第一种方案以来的话会慢1些,因为它是2个浏览器控件,必要渲染html和平化解析js等操作。

稍许网址对爬虫反感,对爬虫请求一律拒绝,那时候大家需求伪装成浏览器,通过改动http中的headers来完结

创建

>>> product = Product(name='Desktop PC', price=1000)
>>> print product
Product(name='Desktop PC', price=1000)

Geckofx下载

headers = {
'Host': "bj.lianjia.com",
'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
'Accept-Encoding': "gzip, deflate, sdch",
'Accept-Language': "zh-CN,zh;q=0.8",
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36",
'Connection': "keep-alive",
}
p = requests.get(url, headers=headers)
print(p.content.decode('utf-8'))

使用值

>>> product['name']
Desktop PC
>>> product.get('name')
Desktop PC

>>> product['price']
1000

>>> product['last_updated']
Traceback (most recent call last):
    ...
KeyError: 'last_updated'

>>> product.get('last_updated', 'not set')
not set

>>> product['lala'] # getting unknown field
Traceback (most recent call last):
    ...
KeyError: 'lala'

>>> product.get('lala', 'unknown field')
'unknown field'

>>> 'name' in product  # is name field populated?
True

>>> 'last_updated' in product  # is last_updated populated?
False

>>> 'last_updated' in product.fields  # is last_updated a declared field?
True

>>> 'lala' in product.fields  # is lala a declared field?
False
GeckoWebBrowser webBrowser = null;

        private void Form1_Load(object sender, EventArgs e)
        {
            string xulrunnerPath = AppDomain.CurrentDomain.BaseDirectory + "\\bin";
            Xpcom.Initialize(xulrunnerPath);
            //设置为3阻止所有的弹出窗口,
            GeckoPreferences.User["privacy.popups.disable_from_plugins"] = 3;
            //禁止加载图片
            GeckoPreferences.User["permissions.default.image"] = 2;

            webBrowser = new GeckoWebBrowser();
            webBrowser.Navigate("http://www.baidu.com");
            webBrowser.DocumentCompleted += DocumentCompleted;
        }

        private void DocumentCompleted(object sender, Gecko.Events.GeckoDocumentCompletedEventArgs e)
        {
            var time = new System.Windows.Forms.Timer();
            time.Interval = 2000;
            time.Tick += (a, b) =>
            {
                time.Stop();
                string html = "";
                //页加载完成
                GeckoHtmlElement element = null;
                var geckoDomElement = webBrowser.Document.DocumentElement;
                if (geckoDomElement != null && geckoDomElement is GeckoHtmlElement)
                {
                    element = (GeckoHtmlElement)geckoDomElement;
                    //网页内容
                    html = element.InnerHtml;
                    txtHtml.Text = html;
                    /*
                    //通过xpath 查找class为btnLogin的元素
                    GeckoNode btnLogin = webBrowser.Document.SelectFirst(".//*[@class='btnLogin']");
                    if (btnLogin != null)
                    {
                        GeckoHtmlElement ie = btnLogin as GeckoHtmlElement;
                        //手动触发点击事件
                        ie.Click();
                    }*/
                }
            };
            time.Start();
        }

三、模拟登6

设置值

>>> product['last_updated'] = 'today'
>>> product['last_updated']
today

>>> product['lala'] = 'test' # setting unknown field
Traceback (most recent call last):
    ...
KeyError: 'Product does not support field: lala'

那里只须要注意贰个位置,不能经过product.name的法门赢得,也不可能因而product.name = "name"的措施设置值。

 

相似登录的历程都陪伴有验证码,那里大家经过selenium本人组织post数据实行提交,将赶回验证码图片的链接地址输出到控制台下,点击图片链接识别验证码,输入验证码并付出,实现报到。

添加Pipeline过滤结果

当Item在Spider中被采集之后,它将会被传送到Item
Pipeline,1些零部件会安分守己一定的逐1执行对Item的拍卖。

种种item pipeline组件(有时称之为“Item
Pipeline”)是完毕了简短方法的Python类。他们收到到Item并透过它实施一些表现,同时也控制此Item是还是不是两次三番通过pipeline,或是被吐弃而不再实行处理。

以下是item pipeline的部分特出应用:

  • 清理HTML数据
  • 表达爬取的数码(检查item包括有个别字段)
  • 查重(并丢弃)
  • 将爬取结果保存到数据库中

现行反革命促成3个Item过滤器,我们把获得出来假诺是None的数码赋值为0,若是Item对象是None则扔掉那条数据。
pipeline1般是放手pipelines.py

    def process_item(self, item, spider):
        if item is not None:
            if item["p_standard_price"] is None:
                item["p_standard_price"] = item["p_shop_price"]
            if item["p_shop_price"] is None:
                item["p_shop_price"] = item["p_standard_price"]

            item["p_collect_count"] = text_utils.to_int(item["p_collect_count"])
            item["p_comment_count"] = text_utils.to_int(item["p_comment_count"])
            item["p_month_sale_count"] = text_utils.to_int(item["p_month_sale_count"])
            item["p_sale_count"] = text_utils.to_int(item["p_sale_count"])
            item["p_standard_price"] = text_utils.to_string(item["p_standard_price"], "0")
            item["p_shop_price"] = text_utils.to_string(item["p_shop_price"], "0")
            item["p_pay_count"] = item["p_pay_count"] if item["p_pay_count"] is not "-" else "0"
            return item
        else:
            raise DropItem("Item is None %s" % item)

末段索要在settings.py中添加那几个pipeline

ITEM_PIPELINES = {
    'TaoBao.pipelines.TTDataHandlerPipeline': 250,
    'TaoBao.pipelines.MysqlPipeline': 300,
}

背后那个数字越小,则执行的相继越靠前,那里先过滤处理多少,获取到正确的数据后,再举办TaoBao.pipelines.MysqlPipeline添加多少到数据库。

完全的代码:[不带数据库版本][
数据库版本]。

         3.phantomjs

from selenium import webdriver
from selenium.webdriver.common.keys import Keys #
from selenium.webdriver.support.ui import WebDriverWait # WebDriverWait的作用是等待某个条件的满足之后再往后运行
from selenium.webdriver import ActionChains
import time
import sys
driver = webdriver.PhantomJS(executable_path='C:\PyCharm 2016.2.3\phantomjs\phantomjs.exe') # 构造网页驱动

driver.get('https://www.zhihu.com/#signin')  # 打开网页
driver.find_element_by_xpath('//input[@name="password"]').send_keys('your_password')
driver.find_element_by_xpath('//input[@name="account"]').send_keys('your_account')
driver.get_screenshot_as_file('zhihu.jpg')     # 截取当前页面的图片
input_solution = input('请输入验证码 :')
driver.find_element_by_xpath('//input[@name="captcha"]').send_keys(input_solution)
time.sleep(2)

driver.find_element_by_xpath('//form[@class="zu-side-login-box"]').submit() # 表单的提交 表单的提交,即可以选择登录按钮然后使用click方法,也可以选择表单然后使用submit方法
sreach_widonw = driver.current_window_handle  # 用来定位当前页面
# driver.find_element_by_xpath('//button[@class="sign-button submit"]').click()
try:
dr = WebDriverWait(driver,5)
# dr.until(lambda the_driver: the_driver.find_element_by_xpath('//a[@class="zu-side-login-box"]').is_displayed())
if driver.find_element_by_xpath('//*[@id="zh-top-link-home"]'):
print('登录成功')
except:
print('登录失败')
driver.save_screenshot('screen_shoot.jpg')  #截取当前页面的图片
sys.exit(0)
driver.quit() #退出驱动

恐怕会碰到的①部分难点

phantomjs能够把它精通为也是一个浏览器控件,只但是它采取QtWebKit作为它基本浏览器的意义,使用webkit来编译解释施行JavaScript代码。利用该器件就能够很便利的获取到网页内容,同时也席卷了ajax加载的多寡,假使是分页的景观下,第一次加载不须求延期,借使获得第二页及以上内容的话壹样也须求延期才能博获得,并且它可以很有益的做到网页快速照相(正是网页截屏),至于其它的职能大家能够友善查阅一下资料。

那中间,PhantomJS是三个很棒的exe,下载地址:phantomjs。他能够效仿浏览器行为开始展览操作。当大家境遇JS渲染的网页,在使用正则表明式、BS四和xpath
. . .
都无法协作出多少时(数据根本没加载上),可以利用PhantomJS模拟浏览器行为发送请求,将会博得网页的原有全体数据。

IDE调试

事先说的艺术都以一贯通过命令scrapy crawl tts来运维。怎么用IDE的调剂功效吗?很不难通过main函数运转爬虫:

#   写到Spider里面
if __name__ == "__main__":
    settings = get_project_settings()
    process = CrawlerProcess(settings)
    spider = TmallAndTaoBaoSpider
    process.crawl(spider)
    process.start()

phantomjs下载地址

4、代理ip

302重定向的标题

在获取数据的时候,很多时候会遭逢网页重定向的题材,scrapy会重回30二然后不会自动重定向后再三再四爬取新地方,在scrapy的装置中,可以经过安顿来开启重定向,那样就算域名是重定向的scrapy也会自动到最后的地方获取内容。
不留余地方案:settings.py中添加REDIRECT_ENABLED = True

  IWebDriver driver = null;

        private void btnGo_Click(object sender, EventArgs e)
        {
            string phantomjsDire = AppDomain.CurrentDomain.BaseDirectory;

            PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService(phantomjsDire);
            service.IgnoreSslErrors = true;
            service.LoadImages = false;
            service.ProxyType = "none";

            driver = new PhantomJSDriver(phantomjsDire);
            /*IWindow iWindow = driver.Manage().Window;
            iWindow.Size = new Size(10,10);
            iWindow.Position = new Point(0, 600);*/

            driver.Navigate().GoToUrl(textBox1.Text);
            string html = driver.PageSource;
            txtHtml.Text = html;

            //driver.Close();
            //driver.Quit();
        }

        private void btnPage_Click(object sender, EventArgs e)
        {
            //  .//*[@class='next'][text()='下一页']
            //  .//*[@class='text']
            //  .//*[@class='button']
            //IWebElement element = driver.FindElement(By.XPath(".//*[@class='text']"));
            //给网页中文本框赋值
            //element.SendKeys("4");

            IWebElement btnElement = driver.FindElement(By.XPath(".//*[@class='next'][text()='下一页']"));
            btnElement.Click();

            var time = new System.Windows.Forms.Timer();
            time.Interval = 2 * 1000;
            time.Tick += (a, b) =>
            {
                time.Stop();
                string html = driver.PageSource;
                txtHtml.Text = html;
            };
            time.Start();
        }

当爬取速度过快时,当呼吁次数过多时都面临ip被封的大概。因而选用代理也是少不了的。

命令行参数字传送递

有的是时候爬虫都有自定义数据,比如事先写的是硬盘关键字,未来通过参数的诀要怎么传递呢?
消除方案:

  • 重写初始化函数 def __init__(self, *args, **kwargs):
    一直在函数参数添加自定义参数:

    def __init__(self, dt=None, keys=None, *args, **kwargs):
        super(TmallAndTaoBaoSpider, self).__init__(*args, **kwargs)
    

    dt 和 keys是自定义的参数。

  • 命令行使用。命令行是通过-a参数来传递的,供给注意的是-a亚洲必赢官网 ,不得不传递1个参数,假设急需传递多少个参数,使用频繁-a

     scrapy crawl tts -a keys="硬盘,光驱" -a dt="20170316"
    
  • IDE中main函数使用。

    if __name__ == "__main__":
         settings = get_project_settings()
         process = CrawlerProcess(settings)
         spider = TmallAndTaoBaoSpider
         process.crawl(spider, keys="硬盘,光驱", dt="20170316")
         process.start()
    

 网址内容中url地址即使是争执地址的话,便是../../a.html,那种境况要想得到相对地址的话,能够用以下措施:

使用request加代理

数码不全(selenium并不知道几时ajax请求达成),延时处理

绝大部分时候,大家得以取到完整的网页新闻,假如网页的ajax请求太多,网速太慢的时候,selenium并不知道曾几何时ajax请求完结,那个时候固然经过self.driver.get(response.url)得到页面,然后经过Selector取数据,很恐怕还没加载成功取不到数据。
缓解方案:通过selenium提供的工具来推迟获取内容,直到获取到数量,大概逾期。

    def _wait_get(self, method):
        """
        延时获取,如果10秒钟还没有获取完成,则返回失败
        :param method:
        :return:
        """
        result = None
        try:
            result = WebDriverWait(self.driver, 10).until(method)
        except:
            self.__error("超时获取:%s  %s" % (self.driver.current_url, self.driver.title))
            log.e()
        return result

那边以得到评论为例:

item['p_comment_count'] = self._wait_get(lambda dr: Selector(text=self.driver.page_source).xpath("//li/div/div[@class='tb-rate-counter']/a/strong/text()").extract_first())

在拾秒以内会从来推行那些lambada函数:

lambda dr: Selector(text=self.driver.page_source).xpath("//li/div/div[@class='tb-rate-counter']/a/strong/text()").extract_first()

直至那些函数重返的不是None,也许十秒后回去超时。

        /// <summary>
        /// 获取绝对url地址
        /// </summary>
        /// <param name="baseUri">当前页地址</param>
        /// <param name="relativeUri">相对路径地址</param>
        /// <returns></returns>
        public static string GetRealUrl(string baseUri, string relativeUri)
        {
            try
            {
                baseUri = System.Web.HttpUtility.UrlDecode(baseUri);
                relativeUri = System.Web.HttpUtility.UrlDecode(relativeUri);
                Uri baseUriModel = new Uri(baseUri);
                Uri uri = new Uri(baseUriModel, relativeUri);
                string result = uri.ToString();
                baseUriModel = null;
                uri = null;
                return result;
            }
            catch (Exception ex)
            {
            }
            return relativeUri;
        }
import requests
proxies = { "http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",}
p = request.get("http://www.baidu.com", proxies = proxies)
print(p.content.decode('utf-8'))

robots.txt不让爬取

Scrapy爬取坚守robots协议,就是网站定义了什么样数据能够爬取,哪些无法爬取,假设网址不允许爬取,依然想爬怎么办?
斩草除根方案:
settings.py中忽略robots协议,添加参数:ROBOTSTXT_OBEY = False

 

使用urllib加代理

恳请数量配置

暗中认可的数目是1陆,能够修改大片段,settings.py中设置:CONCURRENT_REQUESTS = 50

完整的代码:[不带数据库版本][
数据库版本]。

** 免责申明:该内容只为传递知识,要是用做他途后果自负。**

上一篇:Scrapy爬虫框架:Selenium +
PhantomJS

  总结:

user_agent ='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
headers = {'User-Agent':user_agent}
proxy = {'http':'http://10.10.1.10:1080',}
proxy_handler = urllib.request.ProxyHandler(proxy)
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
url = "https://www.baidu.com/"
req = urllib.request.Request(url=url,headers=headers)
res = urllib.request.urlopen(req)
print(res.read().decode('utf-8')) # 打印网页内容

上述说的第一、三种格局都能够博获得ajax异步加载的剧情,同时还能够通过xpath形式寻找网页中的成分,例如分页标签和按钮,找到元素之后可以调用click点击事件,就能自在的消除分页难点。好多网址分页分到最终1页的时候,处理的情景都分歧,须求协调去处理,例如有些隐藏下一页按钮、有的是禁止使用等等。

伍、验证码输入

获取到网页内容之后,要想获得自个儿索要的始末,能够经过HtmlAgilityPack插件,它是透过xpath的情势寻找内容。

遇上验证的标题,小编一般都以人工识别:获取验证码的链接再控制台下 ——>
点击链接识别验证码 ——> 在控制台手动输入验证码并交付。

以下作者会将协调开支的音信搜集系统截图发出来。

六、ajax加载的数码

亚洲必赢官网 4

对于ajax加载的多寡,大家无论通过request或post方法请求获得的网页都爱莫能助获取。

亚洲必赢官网 5亚洲必赢官网 6亚洲必赢官网 7亚洲必赢官网 8亚洲必赢官网 9亚洲必赢官网 10

关于二个网页是不是是ajax加载数据,大家只需将网页内容print到控制台下,将其与网页原始内容展开比对,倘若有数量不够,那么这几个数量正是ajax加载。例如:我们想赢得京东上商品的价格、销量、好评等方面包车型地铁数码,可是请求再次回到的网页中并未那几个数量。因为这一个多少是ajax加载。对于ajax加载的页面,1般有三种方式。

 

(1)分析网页

迎接任何形式的转发,但请务必表明出处。

按F1二开拓浏览器调节和测试工具,在Network下抉择XH冠道或Doc标签,分析(双击点开查看)那多个标签下的链接。假如点开链接打开的网页中恰恰有这些尚未加载的多寡,则那几个数据是透过该链接传送的。再对该链接实行规律分析,未来对该链接发送请求。

文案功底有限,码字不易,不喜勿喷,假设小说和代码有发挥不当之处,还请不吝赐教。

亚洲必赢官网 11

 

(二)使用PhantomJS模拟浏览器行为

利用PhantomJS模拟浏览器举行发送请求,获得重返的内容是全然的(ajax加载的数据也会有)。可是接纳PhantomJS请求速度过慢,一般3个网页4~伍s时间,不可能忍。一般要运用PhantomJS供给开八线程。

driver = webdriver.PhantomJS(executable_path='C:\PyCharm 2016.2.3\phantomjs\phantomjs.exe') # 构造网页驱动
driver.get('https://www.zhihu.com/') 
print(driver.page_source) # 打印网页内容

总结

以上就是本文关于关于反爬虫的一部分粗略总计的全体内容,希望对大家享有帮忙。感兴趣的心上人能够三番8回参照本站:

python爬虫种类Selenium定向爬取新浪篮球图片详解

Python爬虫实例爬取网站搞笑段子

如有不足之处,欢迎留言建议。谢谢朋友们对本站的支撑!

您恐怕感兴趣的篇章:

  • python化解网址的反爬虫策略总计
  • python互联网爬虫之怎么着伪装逃过反爬虫程序的措施
  • 浅谈Scrapy框架普通反爬虫机制的应对策略
  • 教您怎么着编写简单的网络爬虫
  • 零基础写python爬虫之爬虫编写全记录
  • 关于爬虫和反爬虫的简短方案分享
网站地图xml地图