澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:Python网页信息采集,关

.net 音讯搜罗ajax数据

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

在爬取有些网站速度过快照旧产生的呼吁过多的时候,网址会向你所在的客户端发送三个链接,必要您去印证图片。作者在爬链家和拉钩网的进程中就已经遭逢过:

澳门新浦京娱乐场网站 1

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

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

爬虫与反爬虫,这相爱相杀的1对,简直能够写出一部壮观的斗争史。而在大数量时期,数据正是金钱,许多合营社都为温馨的网址使用了反爬虫机制,幸免网页上的多少被爬虫爬走。不过,假如反爬机制过于严厉,或然会损伤到确实的用户请求;假使既要和爬虫死磕,又要确认保障相当低的误伤率,那么又会加大研究开发的基金。

有了前两篇的基本功,接下去通过抓取天猫商城和天猫商店的数据来详细表达,怎样通过Scrapy爬取想要的剧情。完整的代码:[不带数据库版本][ 数据库版本]。

1,引言

近期径直在看Scrapy 爬虫框架,并尝试采取Scrapy框架写三个足以实现网页音讯搜集的简练的小程序。尝试进度中相见了广大小标题,希望咱们多多指教。

正文重要介绍如何采纳Scrapy结合PhantomJS收集天猫商城货色内容,文中自定义了叁个DOWNLOADE凯雷德_MIDDLEWARES,用来搜聚供给加载js的动态网页内容。看了不少介绍DOWNLOADE卡宴_MIDDLEWARES资料,总括来讲就是利用简便,但会阻塞框架,所以品质方面不佳。一些材质中涉嫌了自定义DOWNLOADELX570_HANDLE昂科雷或应用scrapyjs能够缓和阻塞框架的难点,有乐趣的小朋侪能够去钻探一下,这里就不多说了。

关于.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'))

 

轻松易行低端的爬虫速度快,伪装度低,假使没有反爬机制,它们能够火速的抓取多量数据,以致因为请求过多,变成服务器不能够不奇怪专业。

需求

由此天猫商城的寻觅,获取搜索出来的每件货色的销量、收藏数、价格。

二,具体完成

澳门新浦京娱乐场网站:Python网页信息采集,关于反爬虫的一些简单总结。募集网址的三种方法与利弊:

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渲染的网页,在使用正则表明式、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
  • 下一场再把详细地址的剧情总体呼吁出来,里面富含了销量、价格、收藏数据。

之所以,最后的目标是经过获得多个页面包车型大巴剧情,二个是寻找结果,从内部寻找来每一个物品的详细地址,然后第一个是物品详细内容,从中间获取到销量、价格等。

贰.1,情况须求

亟需试行以下步骤,计划Python开拓和周转条件:

  • Python--官网下载安装并布置好条件变量 (本文使用Python版本为三.五.1)
  • lxml-- 官网库下载对应版本的.whl文件,然后命令行分界面推行"pip install .whl文件路线"
  • Scrapy--命令行分界面实施 "pip install Scrapy",详细请参见《Scrapy的率先次运维测试》
  • selenium--命令行分界面实行 "pip install selenium"
  • PhantomJS -- 官网下载

上述手续展现了三种安装:一,安装下载到当地的wheel包;贰,用Python安装管理器实践远程下载和设置。注:包的本子须求和python版本配套

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

在爬取有些网址速度过快依旧产生的哀求过多的时候,网址会向你所在的客户端发送1个链接,供给您去注解图片。笔者在爬链家和拉钩网的进程中就曾经遭逢过:

下载网页

有了思路今后大家先下载找寻结果页面,然后再下载页面中每一种详细音讯页面。

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

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

二.2,开辟和测试进度

先是找到须要搜集的网页,这里差不多找了一个天猫商城商品,网站https://world.tmall.com/item/526449276263.htm, 页面如下:

接下来起初编写制定代码,以下代码暗许都以在命令行分界面实行

1),成立scrapy爬虫项目tmSpider

E:python-3.5.1>scrapy startproject tmSpider

2),修改settings.py配置

  • 更改ROBOTSTXT_OBEY的值为False;
  • 关闭scrapy默许的下载器中间件;
  • 投入自定义DOWNLOADEBMWX叁_MIDDLEWARES。

配备如下:

DOWNLOADER_MIDDLEWARES = {
    'tmSpider.middlewares.middleware.CustomMiddlewares': 543,
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None
}

三),在类型目录下创办middlewares文件夹,然后在文书夹下创制middleware.py文件,代码如下:

# -*- coding: utf-8 -*-

from scrapy.exceptions import IgnoreRequest
from scrapy.http import HtmlResponse, Response

import tmSpider.middlewares.downloader as downloader

class CustomMiddlewares(object):
    def process_request(self, request, spider):
        url = str(request.url)
        dl = downloader.CustomDownloader()
        content = dl.VisitPersonPage(url)
        return HtmlResponse(url, status = 200, body = content)

    def process_response(self, request, response, spider):
        if len(response.body) == 100:
            return IgnoreRequest("body length == 100")
        else:
            return response

四),使用selenium和PhantomJS写一个网页内容下载器,同样在上一步创设好的middlewares文件夹中创建downloader.py文件,代码如下:

# -*- coding: utf-8 -*-
import time
from scrapy.exceptions import IgnoreRequest
from scrapy.http import HtmlResponse, Response
from selenium import webdriver
import selenium.webdriver.support.ui as ui 

class CustomDownloader(object):
    def __init__(self):
        # use any browser you wish
        cap = webdriver.DesiredCapabilities.PHANTOMJS
        cap["phantomjs.page.settings.resourceTimeout"] = 1000
        cap["phantomjs.page.settings.loadImages"] = True
        cap["phantomjs.page.settings.disk-cache"] = True
        cap["phantomjs.page.customHeaders.Cookie"] = 'SINAGLOBAL=3955422793326.2764.1451802953297; '
        self.driver = webdriver.PhantomJS(executable_path='F:/phantomjs/bin/phantomjs.exe', desired_capabilities=cap)
        wait = ui.WebDriverWait(self.driver,10)

    def VisitPersonPage(self, url):
        print('正在加载网站.....')
        self.driver.get(url)
        time.sleep(1)
        # 翻到底,详情加载
        js="var q=document.documentElement.scrollTop=10000"
        self.driver.execute_script(js)
        time.sleep(5)
        content = self.driver.page_source.encode('gbk', 'ignore')
        print('网页加载完毕.....')
        return content

    def __del__(self):
        self.driver.quit()

五) 创设爬虫模块

在等级次序目录E:python-3.5.1tmSpider,执行如下代码:

E:python-3.5.1tmSpider>scrapy genspider tmall 'tmall.com'

实践后,项目目录E:python-3.5.1tmSpidertmSpiderspiders下会自动生成tmall.py程序文件。该程序中parse函数管理scrapy下载器重临的网页内容,搜集网页消息的点子能够是:

  • 动用xpath或正则方式从response.body中收载所需字段,
  • 经过gooseeker api获取的源委提取器实现一站转换全数字段,而且不用手工业编写制定转换用的xpath(怎么样收获内容提取器请参谋python使用xslt提取网页数据),代码如下:
# -*- coding: utf-8 -*-
import time
import scrapy

import tmSpider.gooseeker.gsextractor as gsextractor

class TmallSpider(scrapy.Spider):
    name = "tmall"
    allowed_domains = ["tmall.com"]
    start_urls = (
        'https://world.tmall.com/item/526449276263.htm',
    )

    # 获得当前时间戳
    def getTime(self):
        current_time = str(time.time())
        m = current_time.find('.')
        current_time = current_time[0:m]
        return current_time

    def parse(self, response):
        html = response.body
        print("----------------------------------------------------------------------------")
        extra=gsextractor.GsExtractor()
        extra.setXsltFromAPI("31d24931e043e2d5364d03b8ff9cc77e", "淘宝天猫_商品详情30474","tmall","list")

        result = extra.extract(html)
        print(str(result).encode('gbk', 'ignore').decode('gbk'))
        #file_name = 'F:/temp/淘宝天猫_商品详情30474_'   self.getTime()   '.xml'
        #open(file_name,"wb").write(result)

6),运转爬虫

在E:python-3.5.1tmSpider项目目录下实施命令

E:python-3.5.1simpleSpider>scrapy crawl tmall

输出结果:

提一下,上述命令只可以一回开发银行三个爬虫,假使想同时起步七个呢?那就须要自定义四个爬虫运行模块了,在spiders下开创模块文件runcrawl.py,代码如下

# -*- coding: utf-8 -*-

import scrapy
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner

from tmall import TmallSpider
...
spider = TmallSpider(domain='tmall.com')
runner = CrawlerRunner()
runner.crawl(spider)
...
d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.run()

实行runcrawl.py文件,输出结果:

使用种类自带HttpWebRequest对象,搜集网址内容,优点是搜集成效快,不过倘若网址是ajax异步加载数据的法子,是收集不到网页内容的,并且网址并未有动用ajax的点子,在网页中用到了javascript,比方说:网页内容用document.write的主意出口到网页中的,这种情形也是收获不到剧情的。其次还亟需驾驭对方网址的编码格式(正是网页头部中<meta charset="utf-八"/>),假诺采撷时网址编码格式错误的话,会招致采撷的内容是乱码。但以此是小标题,笔者要好立时查看资料时找到了人家封装好的方法,可是很惭愧因为不知晓小编是什么人了,作者会把相应的代码下载链接提须要大家。以上的难题是因为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采用器,正则表明式,中文化教育程看这么些,具体内容就不多说,只需求了然这样能够高速获得大家必要的从头到尾的经过。

3,展望

以自定义DOWNLOADEKoleos_MIDDLEWARES调用PhantomJs的主意贯彻爬虫后,在堵塞框架的主题素材上纠结了不长的时光,向来在想缓和的章程。后续会探讨一下scrapyjs,splash等任何调用浏览器的措施看是否能有效的消除这么些主题材料。

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

陆、ajax加载的数目

对于ajax加载的数额,大家随意通过request或post方法请求得到的网页都爱莫能助获得。

关于一个网页是不是是ajax加载数据,大家只需将网页内容print到调控台下,将其与网页原始内容张开比对,假诺有数据不够,那么这个数量就是ajax加载。举例:我们想猎取京东上商品的价位、销量、好评等地方的数目,不过请求重回的网页中从不这个数量。因为那几个数量是ajax加载。对于ajax加载的页面,一般有三种艺术。

(一)剖判网页

按F1二展开浏览器调节和测试工具,在Network下抉择XH奥迪Q伍或Doc标签,深入分析(双击点开查看)那四个标签下的链接。借使点开链接张开的网页中正好有那多少个尚未加载的数量,则这个数量是透过该链接传送的。再对该链接实行规律解析,以后对该链接发送请求。

澳门新浦京娱乐场网站 3

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

应用PhantomJS模拟浏览器举行发送请求,获得再次来到的剧情是完全的(ajax加载的数额也有)。可是选用PhantomJS请求速度过慢,一般三个网页肆~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再次回到。Taobao只怕天猫百货店他们的页面内容不均等,所以规则也差别,须要分开去猎取想要的内容。

肆,相关文书档案

1, Python即时网络爬虫:API表明

源码下载地址

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

Item使用

Item是scrapy中拿走出来的结果,前面能够管理那一个结果。

5,集搜客GooSeeker开源代码下载源

1, GooSeeker开源Python网络爬虫GitHub源

          二.浏览器控件

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)

陆,文书档案修改历史

1,2016-07-06:V1.0

因为及时本人付出的时候,用的是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();
        }

叁、模拟登入

设置值

>>> 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,
}

背后那一个数字越小,则实践的11越靠前,这里先过滤管理数据,获取到科学的数据后,再实行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加载的数据,若是是分页的情况下,第壹回加载没有需求延期,假如获得第一页及以上内容的话一样也须要延期才具收获到,并且它能够很便宜的成就网页快速照相(正是网页截屏),至于其余的效用大家能够团结查阅一下资料。

那之中,PhantomJS是3个很棒的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,也许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加代理

恳请数量配置

暗中同意的数据是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')) # 打印网页内容

以上说的第三、3种方式都得以赢获得ajax异步加载的剧情,同时还是能经过xpath情势寻觅网页中的成分,比方分页标签和开关,找到成分之后能够调用click点击事件,就能够自在的消除分页难题。好些个网址分页分到最后一页的时候,管理的情形都不雷同,须要和煦去管理,比如有个别隐藏下一页开关、有的是禁止使用等等。

五、验证码输入

收获到网页内容之后,要想取得本人须求的内容,能够因此HtmlAgilityPack插件,它是通过xpath的情势搜索内容。

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

以下作者会将和谐开荒的消息搜罗系统截图发出来。

陆、ajax加载的数额

澳门新浦京娱乐场网站 4

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

澳门新浦京娱乐场网站 5澳门新浦京娱乐场网站 6澳门新浦京娱乐场网站 7澳门新浦京娱乐场网站 8澳门新浦京娱乐场网站 9澳门新浦京娱乐场网站 10

关于二个网页是或不是是ajax加载数据,我们只需将网页内容print到调整台下,将其与网页原始内容展开比对,即使有数量不够,那么这一个数量正是ajax加载。举例:大家想赢得京东上商品的价位、销量、好评等地方的数额,可是请求再次来到的网页中尚无这一个数量。因为这几个多少是ajax加载。对于ajax加载的页面,一般有三种艺术。

 

(1)剖析网页

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

按F12张开浏览器调节和测试工具,在Network下抉择XH奥迪Q5或Doc标签,深入分析(双击点开查看)那多少个标签下的链接。假若点开链接打开的网页中恰恰有那贰个尚未加载的数目,则那个数量是透过该链接传送的。再对该链接进行规律深入分析,现在对该链接发送请求。

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

澳门新浦京娱乐场网站 11

 

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

采纳PhantomJS模拟浏览器举办发送请求,获得重回的内容是一点壹滴的(ajax加载的数额也是有)。然而利用PhantomJS请求速度过慢,一般3个网页四~伍s时间,不可能忍。一般要运用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爬虫之爬虫编写全记录
  • 至于爬虫和反爬虫的简约方案分享

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:Python网页信息采集,关