.net 新闻搜聚ajax数据

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

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

图片 1

对此30二重定向的主题材料,是出于抓取速度过快引起互连网流量非常,服务器度和胆识别出是机械发送的央求,于是将呼吁重临链接定到某一特定链接,许多是表达图片或空链接。

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

爬虫与反爬虫,那相爱相杀的壹对,差不多能够写出壹部壮观的斗争史。而在大额时期,数据正是金钱,大多商厦都为投机的网址使用了反爬虫机制,防止网页上的数额被爬虫爬走。不过,倘使反爬机制过于严格,大概会推延到确实的用户请求;如若既要和爬虫死磕,又要保管相当低的误伤率,那么又会加大研究开发的基金。

关于.net音讯采撷的资料大多,然则假诺搜集的网站是ajax异步加载数据的形式,又何以收集呢?后天就把温馨做信息征集时,所遭遇的有个别主题材料和经验跟我们享用一下。

2、headers头文件

某些网址对爬虫反感,对爬虫请求1律拒绝,那时候大家供给伪装成浏览器,通过改换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'))

 

大概低档的爬虫速度快,伪装度低,假如未有反爬机制,它们能够非常的慢的抓取大批量数额,乃至因为请求过多,形成服务器不能够正常办事。

采撷网站的两种办法与利弊:

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.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渲染的网页,在选用正则表明式、BS4和xpath
. . .
都不或者协作出多少时(数据根本没加载上),能够行使PhantomJS模拟浏览器行为发送请求,将会收获网页的原有全部数据。

壹、爬取进程中的30贰重定向

  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'))   # 打印网页内容

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

选择种类自带HttpWebRequest对象,收罗网址内容,优点是搜聚功效快,但是一旦网址是ajax异步加载数据的方法,是收罗不到网页内容的,并且网站并未有利用ajax的法子,在网页中用到了javascript,比方说:网页内容用document.write的点子出口到网页中的,那种情景也是收获不到剧情的。其次还亟需明白对方网站的编码格式(正是网页底部中<meta
charset=”utf-八”/>),要是搜聚时网址编码格式错误的话,会导致搜罗的始末是乱码。但以此是没相当,小编要好马上查看资料时找到了外人封装好的方式,然则很羞愧因为不知道我是什么人了,小编会把相应的代码下载链接提必要大家。以上的标题是因为js和ajax是亟需浏览器去分析的,所以产生了获取不到网页内容。

五、验证码输入

赶过验证的标题,作者一般都以人为识别:获取验证码的链接再调控台下 ——>
点击链接识别验证码 ——> 在调整台手动输入验证码并交付。

图片 2

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

陆、ajax加载的数量

对此ajax加载的数额,大家无论通过request或post方法请求获得的网页都没办法儿获取。

关于一个网页是还是不是是ajax加载数据,我们只需将网页内容print到调控台下,将其与网页原始内容张开比对,假诺有数据不够,那么那个数量正是ajax加载。例如:我们想赢得京东上商品的价格、销量、好评等地点的数量,不过请求重返的网页中从不那个数量。因为这么些多少是ajax加载。对于ajax加载的页面,一般有二种方法。

(1)分析网页

按F1二开垦浏览器调节和测试工具,在Network下抉择XHLacrosse或Doc标签,分析(双击点开查看)那五个标签下的链接。假若点开链接展开的网页中正好有那个并未有加载的数据,则那么些多少是由此该链接传送的。再对该链接实行规律分析,以后对该链接发送请求。

图片 3

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

接纳PhantomJS模拟浏览器进行发送请求,获得再次回到的剧情是截然的(ajax加载的数码也会有)。可是选择PhantomJS请求速度过慢,一般1个网页四~5s时间,不能够忍。一般要运用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特定链接,诸多是认证图片或空链接。

源码下载地址

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

          2.浏览器控件

2、headers头文件

因为当时自己付出的时候,用的是cs格局,相信大家1致也会用cs的方式去付出那么些效果。既然是cs格局(不考虑雅观)的状态下自然是WinForm,WinForm中有自带的浏览器控件,这几个是不佳用的,笔者当下用的是Geckofx,基于火狐内核的一款浏览器控件,不过那地点的资料很少,当时遇见了①部分标题都找不到消除方法,但后来要么都消除了。用了该控件就能够拿走到ajax异步加载的数据,在网页加载成功未来,延迟几分钟获取网页内容,就足以很方便的获取到网页内容,缺点是相对第2种方案以来的话会慢一些,因为它是2个浏览器控件,必要渲染html和平化解析js等操作。

稍微网址对爬虫反感,对爬虫请求1律拒绝,那时候大家须要伪装成浏览器,通过修改http中的headers来落到实处

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'))
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();
        }

叁、模拟登录

 

貌似登入的长河都伴随有验证码,这里大家透过selenium本人协会post数据开始展览付出,将回到验证码图片的链接地址输出到调节台下,点击图片链接识别验证码,输入验证码并交由,落成报到。

         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能够把它精晓为也是1个浏览器控件,只不过它使用QtWebKit作为它基本浏览器的效用,使用webkit来编写翻译解释推行JavaScript代码。利用该器件就足以很方便的获取到网页内容,同时也包含了ajax加载的多少,要是是分页的事态下,第3遍加载不要求延期,即使得到第3页及以上内容的话同样也亟需延期本事博得到,并且它能够很便利的到位网页快照(正是网页截屏),至于其余的意义大家能够友善查阅一下材料。

那其间,PhantomJS是一个很棒的exe,下载地址:phantomjs。他可以萧规曹随浏览器行为开始展览操作。当大家相见JS渲染的网页,在使用正则表明式、BS四和xpath
. . .
都心有余而力不足协作出多少时(数据根本没加载上),能够利用PhantomJS模拟浏览器行为发送请求,将会博得网页的原本全体数量。

phantomjs下载地址

4、代理ip

  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被封的只怕。由此使用代理也是必需的。

 网址内容中url地址假如是相对地址的话,正是../../a.html,那种景观要想获得绝对地址的话,能够用以下方法:

使用request加代理

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

 

使用urllib加代理

  总结:

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')) # 打印网页内容

上述说的第3、叁种艺术都能够收获到ajax异步加载的剧情,同时还能够因而xpath形式寻觅网页中的元素,举例分页标签和按键,找到成分之后方可调用click点击事件,就能够自在的消除分页难题。诸多网站分页分到最终一页的时候,管理的景况都不等同,须求和煦去管理,举个例子有个别隐藏下壹页开关、有的是禁止使用等等。

五、验证码输入

获得到网页内容之后,要想获得本身需求的始末,能够通过HtmlAgilityPack插件,它是经过xpath的情势搜索内容。

相遇验证的标题,笔者一般都是人工识别:获取验证码的链接再调节台下 ——>
点击链接识别验证码 ——> 在调控台手动输入验证码并付诸。

以下小编会将和煦开垦的信息搜罗系统截图发出来。

6、ajax加载的数据

图片 4

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

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

关于1个网页是或不是是ajax加载数据,我们只需将网页内容print到调整台下,将其与网页原始内容张开比对,假诺有数据不够,那么那么些数量就是ajax加载。举个例子:我们想博得京东上商品的标价、销量、好评等地方的数据,不过请求重回的网页中未有这么些数量。因为这个数量是ajax加载。对于ajax加载的页面,一般有三种办法。

 

(壹)分析网页

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

按F12开荒浏览器调节和测试工具,在Network下抉择XHHummerH贰或Doc标签,分析(双击点开查看)那多个标签下的链接。如若点开链接展开的网页中恰恰有那多少个从没加载的数目,则那几个多少是通过该链接传送的。再对该链接进行规律分析,未来对该链接发送请求。

文案功底有限,码字不易,不喜勿喷,假如文章和代码有发布不当之处,还请不吝赐教。

图片 11

 

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

运用PhantomJS模拟浏览器进行发送请求,获得再次来到的始末是一点一滴的(ajax加载的数码也会有)。可是使用PhantomJS请求速度过慢,一般多个网页四~五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) # 打印网页内容

总结

如上正是本文关于关于反爬虫的1对简易总计的全体内容,希望对大家持有补助。感兴趣的朋友能够持续参照本站:

python爬虫种类Selenium定向爬取知乎篮球图片详解

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

如有不足之处,迎接留言建议。感激朋友们对本站的协理!

你恐怕感兴趣的小说:

  • python化解网址的反爬虫战术总括
  • python互连网爬虫之如何伪装逃过反爬虫程序的艺术
  • 浅谈Scrapy框架普通反爬虫机制的答复战术
  • 教你什么样编写轻易的互连网爬虫
  • 零基础写python爬虫之爬虫编写全记录
  • 关于爬虫和反爬虫的简约方案分享

Author

发表评论

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