Task 4.爬虫学习

腾讯新闻爬取

任务目标:

  • 了解ajax加载
  • 通过chrome的开发者工具,监控网络请求,并分析
  • 用selenium完成爬虫

了解ajax加载

当我们使用requests抓取页面的时候,可能抓取的页面和看到的页面是不一样的。这是因为我们获取的是服务器发给我们的原html文档,当我们使用游览器来解析这个页面的时候,游览器中的页面则是经过js处理数据后生成的结果。这些数据源可能来自己Ajax,可能包含在html文档中,也可能是js和特定计算生成的。

对于ajax,数据是一种异步加载方式。正常的加载顺序应该是从定向下, 但是在这个过程中有些结点需要载入的内容过大,或者不需要立刻被展示出来。那么我们就希望能够先展示一个框架,然后再由用户的操作决定是否加载剩余内容。原始页面加载完成之后,再向服务器请求某个借口返回数据,然后数据才会处理上传至网上,这就是发送了一个AJAX请求。

如果遇到这样的情况:那么我们就需要去分析页面,然后使用requests库发送一个Ajax请求,那么就可以成功抓取了。

1.1.1 什么是Ajax
Ajax, 全程是 asynchronous JavaScript and XML.这不是一种新的语言而是一种技术。即使用JS在保证页面不被刷新,页面链接不改变的情况下与服务器交互数据并更新部分网页的技术。 1.实例:知乎下拉 2.基本原理:

  • 发送请求
  • 解析内容
  • 渲染页面
    发送请求 监听网络状态,然后设置状态函数。一旦符合条件,就open(),send()向目的地放松请求,收到请求
    解析内容 当对应状态被触发的时候,会发送请求得到响应。那么我们模拟这个请求,就可以截取我们想要的东西了
    渲染页面 操作DOM
  1. 获取html
    文本或者js。
    在html中,最后显示出来的必然是在html本体内,但是由于javascript的存在,没有方法从原文档直接获取文件。
    分析html的中代码,找到哪段html元素(结点)是获取html或js用的。然后再解析那段html文档

分析请求
使用游览器模拟器,直接获取源码。使用游览器定位代码。

# -*- coding: utf-8 -*-
"""
Created on Sun Apr 26 16:58:35 2020

@author: shitianru
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import re
from bs4 import BeautifulSoup

browser = webdriver.Chrome()

def move2botton(driver, i=0):
    #js="window.scrollTo(0,document.body.scrollHeight)"
    js="window.scrollTo(window.scroollX,%d);"%(i*100)
    driver.execute_script(js)
    time.sleep(3)
    
try:
    browser.get("http:\\www.news.qq.com")
    print(browser.current_url)
    print(browser.get_cookies())
    
    ### 下来一次可以获取10个
    for i in range(1, 10):
        move2botton(browser,i)
    
    html = browser.page_source
finally:
    browser.close()
    

def regular(html):
    pattern = r'<h3>热点精选</h3>.*?(<ul.*?</ul>)'
    hot_select = re.findall(pattern, html)[0]
    """
    在列表中
    """
    node=r'<li.*?data-pos="(.*?)".*?<a class.*?href="(.*?)".*?<img.*?alt="(.*?)".*?</li>'
    res = re.findall(node, hot_select)
    

def bs(html):
    result = []
    soup = BeautifulSoup(html, 'lxml')
    jxtit = soup.find_all(class_="jx-tit")[0].next_sibling.contents
    for li in jxtit:
        try:
            tmp = {
            'pos' : li['data-pos'],
            'href' : li.find_all("a")[0]['href'],
            'tag' : li.find_all("img")[0]["alt"]
            }
            result.append(tmp)
            print(result)
        except:
            print("fail to update")
        
    return result

部分结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值