数据之路 - Python爬虫 - Ajax

匿名 (未验证) 提交于 2019-12-02 22:51:30

一、Ajax数据爬取

1.Ajax介绍


2.Ajax数据爬取

# 首先,定义一个方法来获取每次请求的结果。 在请求时,page是一个可变参数,所以我们将它作为方法的参数传递进来,相关代码如下: from  urllib.parse import  urlencode  import  requests  base url = 'https://m.weibo.cn/api/container/getlndex?'  headers = {  'Host':  'm.weibo.cn',  'Referer’:'https://m.weibo.cn/u/2830678474', 'User-Agent':'Mozilla/s.o (Macintosh;  Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML,  like Gecko)  Chrome/58.0.3029.110 Safari/537.36','X-Requested-With ':'XMLHttpRequest', }  def get_page(page)': params = {  'type':'uid',  'value':'2830678474',  'containerid':'1076032830678474',  'page': page  } url = base_url + urlencode(params)  try:      response = requests.get(url, headers=headers)      if response.status_code == 200:      return response.json()  except requests.ConnectionError as e:      print(' Error',  e.args)      # 随后,我们需要定义一个解析方法,用来从结果中提取想要的信息,比如这次想保存微博的id、正文、赞数、 评论数和转发数这几个内容,  那么可以先遍历cards,然后获取mblog 中的各个信息,赋值为一个新的字典返回即可: from  pyquery import  PyQuery as pq  def parse _page (j son):      if json:      items  = j son. get(' data ') .get('cards ')      for item  in  items:          item = item.get('mblog')          weibo = {}          weibo[ 'id'] = item.get('id')          weibo['text'] = pq(item.get('text')). text()          weibo['attitudes']  = item.get('attitudes_count')          weibo [ 'comments '] = item.get('comments_count')          weibo['reposts'] = item.get('reposts_count')          yield weibo  # 最后,遍历一下page,一共10页,将提取到的结果打印输出即可: if name ==  'main':      for page in range(l, 11):          json = get_page(page)          results = parse_page(json)      for result in results:          print(result)  # 加一个方法将结果保存到MongoDB数据库: from  pymongo import MongoClient  client = MongoClient ()  db = client [ 'weibo' ]  collection = db['weibo'] def save_to_mongo(result):     if collection.insert(result):         print('save to Mongo')

二、Selenium库

1.声明浏览器对象

from  selenium import webdriver  browser = webdri ver. Chrome()  browser = webdriver. Firefox()  browser = webdri ver. Edge()  browser = webdriver. PhantomJS()  browser= webdriver.Safari()   # 完成浏览器对象初始化并将其赋值为browser 对象。调用 browser对象,让其执行各个动作以模拟浏览器操作。

2.访问页面

from  selenium import webdnver  browser = webdriver.Chrome()  browser. get (’https://www.taobao.com’ ) print(browser.page_source)  browser. close()   # 用get()方法来请求网页,参数传入链接URL即可。 

3.查找节点

# 单个节点 find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector Selenium提供通用方法find_element(),它需要传入两个参数: 查找方式By和值。find_element(By.ID,id) from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('https://www.taobao.com') input_first = browser.find_element(By.ID,'q') print(input_first) browser.close()  # 多个节点 要查找所有满足条件的节点,需要用find_elements()这样的方法

4.节点交互

from selenium import webdriver import time   browser = webdriver.Chrome() browser.get('https://www.taobao.com') input = browser.find_element_by_id('q')  # send_keys()方法用于输入文字 input.send_keys('iPhone') time.sleep(1)  # clear()方法用于清空文字 input.clear() input.send_keys('iPad') button = browser.find_element_by_class_name('btn-search')  # click()方法用于点击按钮 button.click()

5.动作链

如鼠标拖曳、 键盘按键等,它们没有特定的执行对象,这些动作用另一种方式来执行,那就是动作链。  - 实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处  # 首先,打开网页中的一个拖曳实例,然后依次选中要拖曳的节点和拖曳到的目标节点,接着声明ActionChains对象并将其赋值为actions变量,然后通过调用actions变量的drag_and_drop()方法,  再调用perform()方法执行动作,此时就完成了拖曳操作 from  selenium import  webdnver  from  selenium.webdriver import  ActionChains  browser = webdriver.Chrome()  url =’http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url)  browser.switch_to.frame('iframeResult') source = browser.find_element_by_css selector('#draggable')  target= browser.find_element_by_css_selector('#droppable' )  actions = ActionChains(browser)  actions.drag_and_drop(source, target)  actions.perform() 

6.JavaScript执行


from selenium import webdriver  browser= webdriver.Chrome()  browser. get (’https://www.zhihu.com/explore')  browser.execute_script('window.scrollTo(o, document.body.scrollHeight)’)  browser.execute_script('alert(”To Bottom”)')   # 这里就利用execute script()方法将进度条下拉到最底部,然后弹出alert提示框。

7.获取节点信息

- 获取属性

# 使用get_attribute()方法来获取节点的属性 from  selenium import webdriver  from  selenium.webdriver import  ActionChains  browser = webdri ver. Chrome()  url = 'https://www.zhihu.com/explore'  browser. get ( url)  logo= browser.find_element_by_id(’zh-top-link-logo’)  print(logo)  print(logo.get_attribute(’class' )) 

- 获取文本值

from  selenium import webdriver  browser= webdriver.Chrome()  url =’https://www.zhihu.com/explore’  browser. get(url)  input = browser.find_element by class name('zu-top-add-question’)  print(input.text) 

from. selenium import  webdnver  browser = webdriver. Chrome()  url =’https://www.zhihu.com/explore' browser.get (url)  input= browser.find_element_by_class_name(’zu-top-add-question')  print(input.id)        # 节点id print(input.location)  # 节点页面相对位置 print(input.tag_name)  # 标签名称 print(input.size)      # 节点大小

8.Frame切换



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!