爬虫第四篇

爬虫第四篇
Ajax的动态加载处理方法

对于json格式的相应,如果页面是ajax动态加载的,可用通过设置它的limit(每次页面加载的数量)巧妙的避开,

也可以通过自动化工具selenium来处理ajax的动态加载

import requests
import json
import pymysql

class DoubanSpider:
    def __init__(self):
        self.url = "https://movie.douban.com/j/chart/top_list?"
        self.headers = {"User-Agent":"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"}
        self.db = pymysql.connect("192.168.56.129","lion","123456", "spiderdb",charset="utf8")
        self.cursor = self.db.cursor()
        
    # 获取页面
    def getPage(self,params):
        res = requests.get(self.url,params=params, headers=self.headers)
        res.encoding = "utf-8"
        html = res.text
        # html为[{1个电影信息},{},{}]
        self.parsePage(html)
    
    # 解析页面
    def parsePage(self,html):
        ins = 'insert into film values(%s,%s)'
        rList = json.loads(html)
        for rDict in rList:
            name = rDict["title"]
            score = rDict["score"]
            
            L = [name.strip(),float(score.strip())]
            self.cursor.execute(ins,L)
            self.db.commit()
    
    # 主函数
    def workOn(self):
        number = input("请输入数量:")
        # 传递这些参数,会返回json格式的字符串
        params = {
                "type":"11",
                "interval_id":"100:90",
                "action":"",	
                "start":"0",
                "limit":number 
            }
        self.getPage(params)
               
if __name__ == "__main__":
    spider = DoubanSpider()
    spider.workOn()
自动化工具:selenium

selenium官方文档:https://selenium-python.readthedocs.io/

1.什么是selenium

  1. selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。

  2. selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

  3. selenium的基本使用

  4. from selenium import webdriver
    
    driver = webdriver.Chrome()
    # driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    print(driver.page_source)
    driver.close() 
    
    # 浏览器对象(driver)的方法
    1.driver.save_screenshot('xxx.png')  获取网页截屏
    2.driver.get(url) : 发请求,获响应
    3.driver.page_source : 获取html源码
    4.driver.page_source.find('字符串')		查找失败 : -1
    
    # 单元素查找
    find_element_by_name
    find_element_by_id
    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
    
    # 多元素查找
    find_elements_by_name
    find_elements_by_id
    find_elements_by_xpath
    find_elements_by_link_text
    find_elements_by_partial_link_text
    find_elements_by_tag_name
    find_elements_by_class_name
    find_elements_by_css_selector
    
    # 执行JavaScript
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get("http://www.zhihu.com/explore")
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    driver.execute_script('alert("To Bottom")')
    
    # 获取文本值 text
    input = driver.find_element_by_class_name('zu-top-add-question')
    print(input.text)
    
    # 获取id, 位置, 标签名
    input = driver.find_element_by_class_name('zu-top-add-question')
    print(input.id)
    print(input.location)
    print(input.tag_name)
    print(input.size)
    
    # cookie操作
    get_cookies()
    add_cookie()
    delete_all_cookies()
    
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.zhihu.com/explore')
    print(browser.get_cookies())
    browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'zhaofan'})
    print(browser.get_cookies())
    browser.delete_all_cookies()
    print(browser.get_cookies())
    
  5. 安装

    1. selenium+phantomjs/chromedrive强大网络爬虫组合
    2. chromdriver下载地址:https://chromedriver.storage.googleapis.com/index.html
    3. windows拷贝chromdriver.exe到Scripts目录下,Ubuntu拷贝到 /usr/bin/ 目录中

#案例

from selenium import webdriver
import time 

# 先创建浏览器对象
driver = webdriver.Chrome()
# 打开百度
driver.get('http://www.baidu.com/')
# 找到搜索框,发送文字
key = input("请输入要搜索的内容:")
# 找到搜索框节点
kw = driver.find_element_by_id('kw')
kw.send_keys(key)
# 找到 百度一下 按钮节点,点击一下
su = driver.find_element_by_id('su')
su.click()

time.sleep(1)
# 截图
driver.save_screenshot('美女.png')
# 关闭浏览器
driver.quit()
from selenium import webdriver
import time 

# 创建浏览器对象
driver = webdriver.Chrome()
# 访问京东首页
driver.get('https://www.jd.com/')
# 找到搜索框按钮,接收终端输入,发送到搜索框
text = driver.find_element_by_class_name('text')
key = input("请输入要搜索的内容:")
text.send_keys(key)
# 点击 搜索按钮
button = driver.find_element_by_class_name('button')
button.click()

while True:
    # 执行脚本,进度条拉到最底部
    driver.execute_script( 'window.scrollTo(0,document.body.scrollHeight)')
    time.sleep(3)
    # 提取数据,分析数据
    rList = driver.find_elements_by_xpath('//div[@id="J_goodsList"]//li')
    # rList : ['商品1节点对象','商品2节点对象']
    for r in rList:
        contentList = r.text.split('\n')
        price = contentList[0]
        name = contentList[1]
        commit = contentList[2]
        market = contentList[3]
        
        d = {
                "价格":price,
                "名称":name,
                "评论":commit,
                "商家":market,
                }
        with open("jd.json","a",encoding="utf-8") as f:
            f.write(str(d) + '\n')
        
    # 点击下一页,-1表示没找到
    if driver.page_source.find('pn-next disabled') == -1:
        driver.find_element_by_class_name('pn-next').click()
        time.sleep(3)
    else:
        print("爬取结束")
        break
          
#下一页能点 :  pn-next
#下一页不能点: pn-next disabled
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值