bob体育app.net 消息搜集ajax数据

2019-12-14 03:09栏目:bob体育平台
TAG:

.net 音讯征集ajax数据

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

在爬取某个网址速渡过快只怕产生的央求过多的时候,网址会向您所在的顾客端发送三个链接,须求你去印证图片。作者在爬链家和拉钩网的历程中就已经境遇过:

bob体育平台 1

对于302重定向的难题,是由于抓取速迈过快引起互连网流量至极,服务器度和胆识别出是机器发送的供给,于是将伏乞重回链接定到某生龙活虎一定链接,好多是验证图片或空链接。

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

有了前两篇的根基,接下去通过抓取Taobao和Taobao的数据来详细表明,如何通过Scrapy爬取想要的剧情。完整的代码:[不带数据库版本][ bob体育app,数据库版本]。

关于.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的搜索,获取寻觅出来的每件物品的销量、收藏数、价格。

募集网址的二种艺术与利弊:

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模拟浏览器行为发送哀告,将会获取网页的本来全体数据。

祛除思路

  • 先是,张开天猫的物色页面,在在那之中输入:硬盘,选中列表格局(因为列表格局还未有广告)。
  • 获取到前不久浏览器上边包车型客车地址:
    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
  • bob体育平台,接下来再把详细地址的从头到尾的经过总体伸手出来,里面包涵了销量、价格、收藏数据。

由此,最后的目标是通过获取多个页面包车型大巴源委,叁个是搜索结果,从里边搜索来每贰个商品的详实地址,然后首个是商品详细内容,从内部获取到销量、价格等。

  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-8"/>),假如搜聚时网址编码格式错误的话,会引致搜聚的剧情是乱码。但以此是没反常,小编要好马上翻开资料时找到了外人封装好的办法,可是很可耻因为不知道作者是哪个人了,小编会把相应的代码下载链接提供给大家。以上的主题材料是因为js和ajax是内需浏览器去分析的,所以产生了得到不到网页内容。

5、验证码输入

相遇验证的标题,作者日常都以人为识别:获取验证码的链接再调节台下 ——> 点击链接识别验证码 ——> 在调节台手动输入验证码并交付。

赢得想要的内容(Selector卡塔尔(英语:State of Qatar)

地点说了何等下载内容,当大家下载好内容后,必要从里边去获取我们想要的有用音讯,这里将要用到采纳器,采用器布局方式比较多,只介绍黄金年代种,这里看详细消息:

>>> 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下抉择XHSportage或Doc标签,解析(双击点开查看)那七个标签下的链接。借使点开链接展开的网页中适逢其会有那个未有加载的数目,则那么些数量是经过该链接传送的。再对该链接进行规律解析,现在对该链接发送伏乞。

bob体育平台 2

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

 

管理内容

轻便的牵线了怎么获取内容后,现在我们从第三个搜索结果中赢得大家想要的商品详细链接,通过查阅网页源代码能够看看,商品的链接在这里处:

...
<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重回。天猫商城可能天猫商号他们的页面内容分歧,所以法则也不及,需求分开去赢得想要的内容。

源码下载地址

Item使用

Item是scrapy中获得出来的结果,前边能够拍卖这几个结果。

          2.浏览器控件

定义

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等操作。

创建

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

Geckofx下载

使用值

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

版权声明:本文由bob体育app发布于bob体育平台,转载请注明出处:bob体育app.net 消息搜集ajax数据