关于反爬虫的总结,信息采集ajax数据

.net 消息征求ajax数据

1、爬取进度中的302重定向

在爬取某些网址速度过快依旧发生的呼吁过多的时候,网址会向你所在的客户端发送三个链接,要求您去验证图片。作者在爬链家和拉钩网的进度中就早就境遇过:

图片 1

对于302重定向的标题,是出于抓取速度过快引起网络流量极度,服务器度和胆识别出是机械发送的呼吁,于是将呼吁重返链接定到某一特定链接,相当多是认证图片或空链接。

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

爬虫与反爬虫,那相守相杀的一对,几乎能够写出一部壮观的斗争史。而在大数目时期,数据就是金钱,相当多小卖部都为和谐的网址接纳了反爬虫机制,制止网页上的数量被爬虫爬走。不过,假若反爬机制过于严厉,大概会损害到确实的客户诉求;倘若既要和爬虫死磕,又要力保极低的误伤率,那么又会加大研究开发的本钱。

有了前两篇的根底,接下去通过抓取天猫和天猫市肆的数额来详细表达,怎么样通过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'))

 

粗略低等的爬虫速度快,伪装度低,若无反爬机制,它们得以火速的抓取大批量数目,以至因为央浼过多,形成服务器无法健康专门的学业。

需求

经过Taobao的搜求,获取找出出来的每件货色的销量、收藏数、价格。

访谈网址的三种办法与利弊:

3、模拟登录

日常登陆的进度都伴随有验证码,这里大家由此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.3phantomjsphantomjs.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渲染的网页,在应用正则表明式、BS4和xpath . . . 都敬敏不谢协作出多少时(数据根本没加载上),能够选拔PhantomJS模拟浏览器行为发送必要,将会赢得网页的原始整体数据。

1、爬取进度中的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. 关于反爬虫的总结,信息采集ajax数据。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-8"/>),借使收罗时网址编码格式错误的话,会产生搜罗的始末是乱码。但这几个是小标题,小编要好马上查看资料时找到了别人封装好的艺术,不过很惭愧因为不理解我是哪个人了,小编会把相应的代码下载链接提必要大家。以上的标题是因为js和ajax是急需浏览器去分析的,所以导致了收获不到网页内容。

5、验证码输入

遭逢验证的难题,笔者日常都以人造识别:获取验证码的链接再调控台下 ——> 点击链接识别验证码 ——> 在调控台手动输入验证码并交由。

图片 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加载的页面,平常常有二种格局。

(1)解析网页

按F12开拓浏览器调节和测量检验工具,在Network下抉择XH福特Explorer或Doc标签,解析(双击点开查看)那七个标签下的链接。借使点开链接展开的网页中恰恰有这个尚未加载的多寡,则那几个多少是透过该链接传送的。再对该链接举办规律分析,未来对该链接发送供给。

图片 3

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

动用PhantomJS模拟浏览器实行发送哀告,得到重回的剧情是完全的(ajax加载的数码也可能有)。不过使用PhantomJS供给速度过慢,日常三个网页4~5s时间,不可能忍。日常要利用PhantomJS必要开多线程。

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

 

对此302重定向的难题,是由于抓取速度过快引起网络流量极度,服务器度和胆识别出是机械发送的乞请,于是将必要重返链接定到某一特定链接,好多是表达图片或空链接。

拍卖内容

简言之的牵线了怎么获取内容后,以往大家从第二个找寻结果中获得我们想要的货品详细链接,通过查阅网页源代码能够看来,商品的链接在这间:

...
<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再次回到。天猫也许天猫商号他们的页面内容不平等,所以法规也不一致,需求分开去获取想要的内容。

源码下载地址

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

Item使用

Item是scrapy中赢得出来的结果,后面能够管理这几个结果。

          2.浏览器控件

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异步加载的数据,在网页加载成功之后,延迟几分钟获取网页内容,就能够很便利的得到到网页内容,劣点是对峙第一种方案以来的话会慢一些,因为它是叁个浏览器控件,需求渲染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();
        }

3、模拟登入

设置值

>>> 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,一些零部件会遵循一定的各种施行对Item的管理。

各种item pipeline组件(有的时候称之为“Item Pipeline”)是落到实处了简要方法的Python类。他们接受到Item并经过它施行一些作为,同一时候也决定此Item是或不是再而三通过pipeline,或是被撇下而不再进行拍卖。

以下是item pipeline的局地标准应用:

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

当今落到实处贰个Item过滤器,我们把得到出来如若是None的多少赋值为0,假诺Item对象是None则扔掉那条数据。
pipeline平日是置于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.3phantomjsphantomjs.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加载的数码,假设是分页的情事下,第三次加载无需延期,即使得到第2页及以上内容的话同样也亟需延期工夫获得到,何况它能够很便利的到位网页快速照相(就是网页截屏),至于其他的效应我们能够协考察阅一下材质。

那其间,PhantomJS是四个很棒的exe,下载地址:phantomjs。他得以依样葫芦浏览器行为张开操作。当大家相见JS渲染的网页,在接纳正则表明式、BS4和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会再次来到302然后不会自动重定向后延续爬取新鸿基土地资金财产方,在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唯其如此传递多少个参数,如若急需传递三个参数,使用频仍-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())

在10秒以内会一贯执行这些lambada函数:

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

直至那几个函数重临的不是None,或许10秒后回到超时。

        /// <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加代理

呼吁数量配置

默许的数量是16,可以修改大一些,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')) # 打印网页内容

以上说的第2、3种办法都得以得到到ajax异步加载的剧情,同一时候还是能因而xpath情势找寻网页中的元素,举例分页标签和按键,找到成分之后方可调用click点击事件,就能够轻轻巧松的缓慢解决分页难点。许多网站分页分到最终一页的时候,管理的动静都分歧样,必要自个儿去管理,举例有个别掩饰下一页开关、有的是禁止使用等等。

5、验证码输入

取获得网页内容之后,要想博得本身索要的剧情,能够经过HtmlAgilityPack插件,它是透过xpath的格局找出内容。

赶过验证的主题材料,作者经常都是人工识别:获取验证码的链接再调控台下 ——> 点击链接识别验证码 ——> 在调整台手动输入验证码并付出。

以下小编会将协和付出的音信搜求系统截图发出来。

6、ajax加载的数据

图片 4

对于ajax加载的数目,大家不管通过request或post方法央求得到的网页都无法获得。

图片 5图片 6图片 7图片 8图片 9图片 10

有关八个网页是不是是ajax加载数据,我们只需将网页内容print到调整台下,将其与网页原始内容实行比对,假设有多少远远不足,那么那一个多少正是ajax加载。举例:大家想获得京东上货色的标价、销量、好评等方面包车型地铁数量,但是恳求再次回到的网页中未有这一个数据。因为这几个数据是ajax加载。对于ajax加载的页面,通常常有三种办法。

 

(1)分析网页

接待任何款式的转发,但请必需表明出处。

按F12开荒浏览器调试工具,在Network下抉择XHEscort或Doc标签,深入分析(双击点开查看)那七个标签下的链接。假如点开链接打开的网页中正好有那一个未有加载的数额,则那些多少是经过该链接传送的。再对该链接实行规律解析,以往对该链接发送须要。

文案功底有限,码字不易,不喜勿喷,纵然小说和代码有发挥不当之处,还请多多点拨。

图片 11

 

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

动用PhantomJS模拟浏览器实行发送乞求,获得再次来到的内容是全然的(ajax加载的多寡也可能有)。可是接纳PhantomJS要求速度过慢,平常二个网页4~5s时间,不能忍。平常要动用PhantomJS需求开多线程。

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

总结

如上正是本文关于关于反爬虫的有的总结总括的全体内容,希望对我们持有利于。感兴趣的相恋的人能够承接参照本站:

python爬虫连串Selenium定向爬取知乎篮球图片详解

Python爬虫实例爬取网址滑稽段子

如有不足之处,款待留言建议。感激朋友们对本站的支撑!

您可能感兴趣的篇章:

  • python化解网址的反爬虫攻略总括
  • python网络爬虫之怎么样伪装逃过反爬虫程序的主意
  • 浅谈Scrapy框架普通反爬虫机制的作答战略
  • 教你如何编写轻巧的网络爬虫
  • 零基础写python爬虫之爬虫编写全记录
  • 有关爬虫和反爬虫的简要方案分享

本文由星彩网app下载发布于计算机编程,转载请注明出处:关于反爬虫的总结,信息采集ajax数据

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。