威尼斯人线上娱乐

至于反爬虫的1些简易计算,关于反爬虫的计算

8 4月 , 2019  

.net 消息收集ajax数据

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

在爬取某个网址速度过快依旧产生的呼吁过多的时候,网址会向你所在的客户端发送贰个链接,须求您去注明图片。笔者在爬链家和拉钩网的进度中就曾经遭逢过:

威尼斯人线上娱乐 1

对于30二重定向的题材,是出于抓取速度过快引起互联网流量相当,服务器度和胆识别出是机器发送的呼吁,于是将呼吁重返链接定到某1特定链接,大多是认证图片或空链接。

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

爬虫与反爬虫,那相爱相杀的壹对,简直能够写出一部壮观的斗争史。而在大数量时期,数据正是金钱,很多店铺都为友好的网站使用了反爬虫机制,幸免网页上的多寡被爬虫爬走。不过,假诺反爬机制过于严谨,大概会挫伤到确实的用户请求;假使既要和爬虫死磕,又要确认保障相当低的误伤率,那么又会加大研究开发的老本。

有了前两篇的底蕴,接下去通过抓取天猫商城和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'))

 

不难低级的爬虫速度快,伪装度低,假使未有反爬机制,它们得以火速的抓取大批量数量,甚至因为请求过多,造成服务器无法健康办事。

需求

由此Tmall的探寻,获取搜索出来的每件货物的销量、收藏数、价格。

采访网站的三种形式与利弊:

三、模拟登六

相似登录的长河都伴随有验证码,那里我们经过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模拟浏览器行为发送请求,将会取得网页的固有全体数据。

一、爬取进程中的30二重定向

赶尽杀绝思路

  • 首先,打开天猫的搜寻页面,在里面输入:硬盘,选中列表形式(因为列表形式尚未广告)。
  • 获取到明日浏览器下边的地点:
    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
  • 下一场再把详细地址的情节全方位呼吁出来,里面富含了销量、价格、收藏数据。

由此,最后的指标是由此获得多个页面包车型地铁剧情,一个是摸索结果,从里头找出来每2个货物的详尽地址,然后第二个是商品详细内容,从里面获得到销量、价格等。

  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'))

至于反爬虫的1些简易计算,关于反爬虫的计算。使用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是急需浏览器去分析的,所以造成了收获不到网页内容。

5、验证码输入

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

威尼斯人线上娱乐 2

取得想要的内容(Selector)

地方说了怎么下载内容,当大家下载好剧情后,需求从内部去获得大家想要的有用音讯,那里即将用到选择器,选拔器构造形式相比多,只介绍1种,那边看详细音讯:

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

这般就因此xpath取出来了good其一单词,更详尽的xpath教程点击那里。
Selector
提供了众多格局出了xpath,还有css采纳器,正则表明式,华语教程看这么些,具体内容就不多说,只要求精通这么能够急速得到大家必要的内容。

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

陆、ajax加载的数码

对于ajax加载的多少,大家不管通过request或post方法请求得到的网页都心有余而力不足得到。

至于二个网页是还是不是是ajax加载数据,大家只需将网页内容print到控制台下,将其与网页原始内容开始展览比对,假设有多少不够,那么那一个数据正是ajax加载。例如:大家想取得京东上货物的价位、销量、好评等地点的数目,可是请求重回的网页中从未这么些多少。因为这几个数据是ajax加载。对于ajax加载的页面,一般有二种艺术。

(1)分析网页

按F12开拓浏览器调试工具,在Network下抉择XH君越或Doc标签,分析(双击点开查看)那多个标签下的链接。即使点开链接打开的网页中正好有那3个尚未加载的数目,则这一个数据是经过该链接传送的。再对该链接进行规律分析,以往对该链接发送请求。

威尼斯人线上娱乐 3

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

应用PhantomJS模拟浏览器实行发送请求,获得再次回到的始末是一心的(ajax加载的多少也会有)。但是使用PhantomJS请求速度过慢,一般二个网页肆~伍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也许Taobao他们的页面内容不等同,所以规则也分化,必要分开去获得想要的始末。

源码下载地址

在那种时候,既然已经被识别出来了,就动用代理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种方案以来的话会慢一些,因为它是1个浏览器控件,供给渲染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();
        }

叁、模拟登陆

设置值

>>> 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并经过它实施1些行事,同时也决定此Item是不是继续透过pipeline,或是被抛弃而不再实行拍卖。

以下是item pipeline的有的超人应用:

  • 清理HTML数据
  • 证实爬取的数目(检查item包蕴有些字段)
  • 查重(并丢弃)
  • 将爬取结果保存到数据库中

前几日达成四个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,
}

后边这几个数字越小,则履行的1一越靠前,那里先过滤处理数据,获取到正确的多少后,再实施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加载的数码,假如是分页的动静下,第3遍加载不供给延期,假若获得第三页及以上内容的话一样也亟需延期才能赢获得,并且它能够很有益于的到位网页快速照相(正是网页截屏),至于其余的法力咱们能够自个儿查阅一下材质。

那之中,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

30二重定向的标题

在获取数据的时候,很多时候会遇到网页重定向的题材,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只好传递多少个参数,若是急需传递几个参数,使用频仍-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页的时候,处理的情事都不均等,须要团结去处理,例如某些隐藏下壹页按钮、有的是禁止使用等等。

5、验证码输入

收获到网页内容之后,要想赢得自个儿索要的内容,能够通过HtmlAgilityPack插件,它是通过xpath的形式寻找内容。

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

以下小编会将团结开发的消息搜集系统截图发出来。

陆、ajax加载的数额

威尼斯人线上娱乐 4

对此ajax加载的数据,大家无论通过request或post方法请求获得的网页都不可能取得。

威尼斯人线上娱乐 5威尼斯人线上娱乐 6威尼斯人线上娱乐 7威尼斯人线上娱乐 8威尼斯人线上娱乐 9威尼斯人线上娱乐 10

关于二个网页是不是是ajax加载数据,大家只需将网页内容print到控制台下,将其与网页原始内容展开比对,若是有数量不够,那么那么些数量正是ajax加载。例如:大家想获取京东上商品的标价、销量、好评等方面包车型客车数额,但是请求重临的网页中尚无那么些数量。因为那些多少是ajax加载。对于ajax加载的页面,1般有二种办法。

 

(一)分析网页

迎接任何格局的转发,但请务必申明出处。

按F12开辟浏览器调节和测试工具,在Network下抉择XHQashqai或Doc标签,分析(双击点开查看)那八个标签下的链接。借使点开链接打开的网页中正好有那么些从没加载的数据,则那一个多少是由此该链接传送的。再对该链接进行规律分析,未来对该链接发送请求。

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

威尼斯人线上娱乐 11

 

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

使用PhantomJS模拟浏览器进行发送请求,得到重回的内容是全然的(ajax加载的数量也会有)。但是利用PhantomJS请求速度过慢,壹般三个网页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) # 打印网页内容

总结

上述就是本文关于关于反爬虫的有的不难计算的全体内容,希望对大家具有帮衬。感兴趣的仇敌能够一连参照本站:

python爬虫体系Selenium定向爬取网易篮球图片详解

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

威尼斯人线上娱乐 ,如有不足之处,欢迎留言指出。感激朋友们对本站的补助!

你可能感兴趣的小说:

  • python化解网址的反爬虫策略总计
  • python网络爬虫之怎么样伪装逃过反爬虫程序的章程
  • 浅谈Scrapy框架普通反爬虫机制的回答策略
  • 教您如何编写简单的网络爬虫
  • 零基础写python爬虫之爬虫编写全记录
  • 至于爬虫和反爬虫的总结方案分享


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图